【发布时间】:2013-05-24 17:26:14
【问题描述】:
受到my own answer 的启发,我什至不明白它是如何工作的,请考虑以下几点:
def has22(nums):
it = iter(nums)
return any(x == 2 == next(it) for x in it)
>>> has22([2, 1, 2])
False
我预计会引发StopIteration,因为在达到2 时,next(it) 将推进消耗的迭代器。但是,这种行为似乎已被完全禁用,仅适用于生成器表达式!一旦发生这种情况,生成器表达式似乎会立即break。
>>> it = iter([2, 1, 2]); any(x == 2 == next(it) for x in it)
False
>>> it = iter([2, 1, 2]); any([x == 2 == next(it) for x in it])
Traceback (most recent call last):
File "<pyshell#114>", line 1, in <module>
it = iter([2, 1, 2]); any([x == 2 == next(it) for x in it])
StopIteration
>>> def F(nums):
it = iter(nums)
for x in it:
if x == 2 == next(it): return True
>>> F([2, 1, 2])
Traceback (most recent call last):
File "<pyshell#117>", line 1, in <module>
F([2, 1, 2])
File "<pyshell#116>", line 4, in F
if x == 2 == next(it): return True
StopIteration
即使这样也行!
>>> it=iter([2, 1, 2]); list((next(it), next(it), next(it), next(it))for x in it)
[]
所以我想我的问题是,为什么要为生成器表达式启用此行为?
注意:3.x中的行为相同
【问题讨论】:
-
也受到了我的 cmets 的启发。我知道,我现在很有名。