无法理解python生成器

时间:2014-04-23 16:13:58

标签: python generator

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

我不明白这个输出。谁能帮助我理解我缺乏理解?提前谢谢。

1 个答案:

答案 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)