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

Python生成器:令人困惑的结果,python,generator,yield,next,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>"

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

>>> 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
>>>
>>def gen():
...  对于范围(5)中的i:
...   产量一
...
>>>计数=gen()
>>>就我而言:
...  打印计数。下一步()
...
1.
3.
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
停止迭代
>>>
这是怎么回事?看起来,当它点击“for i in count:”行时,生成器将生成第一个值。我不确定

编辑:我应该补充一点,我不是想“把事情做好”。我试图打破一些东西,看看Python是如何反应的。当我产生错误时,我会对语言有更多的了解。这个错误使我难堪,但现在一切都清楚了。
到目前为止,所有的答案都简短而甜蜜。谢谢大家

对于计数中的i:
已在调用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
输出:

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

count=gen()
for i in count:
    print i
0
1
2
3
4
注意事项:

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

count=gen()
for i in count:
    print i
0
1
2
3
4
当您循环计数中的i时,您试图在这里再次获取下一个项目
count.next()
您试图获取第二个元素。因此,基本上您试图从当前位置获取元素+2

因此,代码中发生的情况如下所示:

步骤:

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

count=gen()
for i in count:
    print i
0
1
2
3
4
1.
对于计数中的i
这里得到下一个值,即
0

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

3.
对于计数中的i
这里再次调用下一个值,即
2

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

5.
对于计数中的i
这里再次调用下一个值,即
4


6.最后在这里,您正在调用
打印计数。next()
,因为生成器中没有值。您已经为i in count和
计数给出了异常
StopIteration

。next()
都在尝试获取下一项-为什么在同一个循环中使用它们?!我真的很喜欢你用一句话把所有的东西都抓住了。我试图给出一个简短的答案,但我做不到。你的“长途跋涉”很有趣。我也要练习。