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