如果它除了len(n)没有余数,我试图得到n的除数长度(这是一个列表)。
i = takewhile(lambda d: len(n) % d == 0 for d in range(3, 6), n)
我收到了以下语法错误
如果不是唯一的参数
,则生成器表达式必须加括号
因此,我将代码修改为以下内容:
i = takewhile((lambda d: len(n) % d == 0 for d in range(3, 6)), n)
itertools.takewhile at 0xa7075c8>
我出错了什么?
答案 0 :(得分:0)
它输出<itertools.takewhile at 0xa7075c8>
的原因是因为itertools产生生成器,而不是列表。所以结果是没有实现,直到你确实需要它(或围绕它包裹list(..)
)。
正如编译器所说,生成器应该是parentesis,不是整个lambda表达式。所以:
i = takewhile(lambda d: (len(n) % d == 0 for d in range(3, 6)), n)
但我们还没有:你在lambda的头部和生成器中定义d
,确实:
i = takewhile(lambda d: (len(n) % d == 0 for d in range(3, 6)), n)
最后你以错误的方式使用takewhile
。据我所知,你想要第一个成功的元素,你可以简单地在你构建的生成器上调用.next()
,所以你可能想要:
i = (d for d in range(3, 6) if len(n) % d == 0).next()
在Python-2中,或者:
i = next(d for d in range(3, 6) if len(n) % d == 0)
在Python-3中。
在解释器中运行它会给出:
$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> n=[1,2,3,4,5,6,7,8,9]
>>> i = next(d for d in range(3, 6) if len(n) % d == 0)
>>> i
3
>>> n=[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5]
>>> i = next(d for d in range(3, 6) if len(n) % d == 0)
>>> i
5