无法理解python生成器generators

Trouble understanding python generators

本问题已经有最佳答案,请猛点这里访问。

我对python中的生成器不熟悉。我有一个足够简单的代码,我正在玩,但我不能理解输出我从中得到。这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)

我希望我的输出是这样的:

1
2
0  1  2
1  2  3

但我只看到:0 1 1

我不理解这个输出。有人能帮我解决我的不理解吗?事先谢谢。


生成器(和所有iterables一样)只能迭代一次。到print_gen(x)完成时,x也完成了。任何进一步尝试从x中获取新值都将导致StopIteration被提高。

这工作:

1
2
3
4
x = do_gen()
y = (incr_gen(i) for i in do_gen())
print_gen(x)
print_gen(y)

这样就产生了两个独立的发电机。在您的版本中,分配给y的生成器表达式期望x生成更多的值。

当您依次使用next()功能时,更容易看到x发生器与y共享:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> 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