我是python中的新生成器。我有一个简单的代码,我正在玩,但我无法理解我从中得到的输出。这是我的代码:
def do_gen():
for i in range(3):
yield i
def incr_gen(y):
return y + 1
def print_gen(x):
for i in x:
print i
x = do_gen()
y = (incr_gen(i) for i in x)
print_gen(x)
print_gen(y)
我希望我的输出是这样的:
0 1 2
1 2 3
但我只看到: 0 1 2
我不明白这个输出。谁能帮助我理解我缺乏理解?提前谢谢。
答案 0 :(得分:5)
生成器(与所有迭代物一样)只能通过迭代。到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
产生更多值。
当您依次使用x
函数时,更容易看到y
生成器与next()
共享:
>>> 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
请注意此处StopIteration
引发的next(y)
。