无法理解python生成器
这个问题在这里已经有了答案:
生成器(像所有迭代器)只能迭代一次。 到print_gen(x)
完成时, x
。 任何进一步尝试从x
获取新值都会导致StopIteration
被提升。
这工作:
x = do_gen()
y = (incr_gen(i) for i in do_gen())
print_gen(x)
print_gen(y)
因为这会创建两个独立的独立发电机 在您的版本中,您分配给y
的生成器表达式期望x
生成更多值。
当您对它们依次使用next()
函数时,更容易看出x
生成器与y
共享:
>>> def do_gen():
... for i in range(3):
... yield i
...
>>> def incr_gen(y):
... return y + 1
...
>>> x = do_gen()
>>> y = (incr_gen(i) for i in x)
>>> next(x) # first value for the range
0
>>> next(y) # second value from the range, plus 1
2
>>> next(x) # third value from the range
2
>>> next(y) # no more values available, generator done
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
请注意next(y)
提出的StopIteration
。
上一篇: Trouble understanding python generators
下一篇: How does a function in Python remember its values after it returns?