我正在玩生成器以更好地了解它们的工作原理,但我对以下代码的结果感到困惑:
>>> 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的反应。当我生成错误时,我会更多地了解该语言。这个错误让我很难过,但现在一切都清楚了。 到目前为止,所有答案都简短而甜蜜。谢谢大家!
答案 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