2015-10-13 47 views
5

我玩弄发电机,以便更好地了解他们的工作,但我很困惑与下面这段代码的结果:Python的发电机:混乱的结果

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

这是怎么回事?看起来像它击中“为我计数:”行生成器产生第一个值。我不确定。

编辑:我应该补充一点,我并没有试图“弄清楚”。我试图破解一些东西,看看Python如何反应。当我生成错误时,我会更多地了解该语言。这个错误让我感到遗憾,但现在已经很清楚了。 到目前为止,所有的答案都是简短而甜蜜的。谢谢大家!

+2

'为我计数'和'count.next()'都*都试图获得下一个项目 - 你为什么在同一个循环中使用它们? – jonrsharpe

回答

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你想了解我的下一个项目再次在这里你想获得的第二个元素。所以基本上你正试图从当前位置

那么在你的代码的情况是如获得元素+2 count.next()如下:

步骤:

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

2

for i in count:已在接下来调用(并将值赋给i)。然后你的代码再次调用。

如果你只是想打印的每个值

for i in count: 
    print i 

或圆形的很长的路要走

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

你的“漫长的路”很有趣。我也会练习。 – solid

3

因为“为”循环已经迭代的发生器值,步步为营两个值产生:一个在“for”中,另一个在循环体中。

+0

我真的很喜欢你如何在一个句子中捕捉所有。我试图制定一个简短的答案,但我无法。 – solid