Python Generator:令人困惑的结果

时间:2015-10-13 10:22:44

标签: python generator yield next

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

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

这里发生了什么?看起来像是因为它击中了&#34;因为我的数量:&#34;生成器生成第一个值。我不确定。

编辑:我应该补充一点,我并没有尝试'#34;正确的&#34;。我试图破解事物以了解Python的反应。当我生成错误时,我会更多地了解该语言。这个错误让我很难过,但现在一切都清楚了。 到目前为止,所有答案都简短而甜蜜。谢谢大家!

3 个答案:

答案 0 :(得分:5)

您的代码应该是这样的

<强>代码:

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.最后在这里你正在调用print count.next(),因为生成器中没有值。你已经给出异常StopIteration

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

如果您只想打印每个值

for i in count:
    print i

或长途跋涉

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