Python 生成器:令人困惑的结果

Python Generator: confusing result

我正在研究生成器以更好地理解它们的工作原理,但我对以下代码段的结果感到困惑:

>>> def gen():
...  for i in range(5):
...   yield i
...
>>> count=gen()
>>> for i in count:
...  print count.next()
...
1
3
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
StopIteration
>>>

这是怎么回事?看起来当它到达 "for i in count:" 行时,生成器会产生第一个值。我不确定。

编辑:我应该补充一点,我并不是要 "get it right"。我正在尝试破坏事物以查看 Python 的反应。当我产生错误时,我会更多地了解该语言。这个错误让我很困惑,但现在一切都清楚了。 到目前为止,所有的答案都是简短而甜蜜的。谢谢大家!

for i in count: 已经在调用 next(并将值赋给 i)。然后您的代码再次调用 next。

如果你只想打印每个值

for i in count:
    print i

或从长远来看

while True:
    try:
        print count.next()
    except StopIteration, si:
        break

因为 "for" 循环已经迭代了你的生成器值,所以在每一步都会产生两个值:一个在 "for" 中,一个在循环体中。

你的代码应该是这样的

代码:

def gen():
    for i in range(5):
        yield i

count=gen()
for i in count:
    print i

输出:

0
1
2
3
4

备注:

当你循环时 for i in count 你试图在这里再次获取下一个项目 count.next() 你试图获取第二个元素。所以基本上你试图从当前位置获取元素 +2

所以你的代码中发生的事情如下:

步骤:

1.for i in count 这里得到下一个值是0

2.print count.next() 这里再次调用并打印下一个值,因此打印 1

3.for i in count 这里再次调用下一个值,即 2

4.print count.next() 这里再次调用并打印下一个值,因此打印 3

5.for i in count 这里再次调用下一个值,即 4

6.finally 这里你调用 print count.next() 因为生成器中没有值。你已经给出了异常 StopIteration