不清楚如何使用takewhile python

时间:2017-01-26 13:30:19

标签: python-2.7

如果它除了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>

我出错了什么?

1 个答案:

答案 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