【问题标题】:Trouble understanding python generators [duplicate]无法理解python生成器[重复]
【发布时间】:2014-06-08 14:50:56
【问题描述】:

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

我不明白这个输出。谁能帮我解决我缺乏理解的问题?提前致谢。

【问题讨论】:

  • 当你到达最后一行时,你的发电机已经耗尽了。

标签: python generator


【解决方案1】:

生成器(与所有可迭代对象一样)只能迭代一次。当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 以及此处。

【讨论】:

  • 或者更确切地说:生成器返回一个迭代器,它只能被迭代一次。
  • @AlexThornton:一般来说,生成器是一种专门的迭代器。
猜你喜欢
  • 2021-08-28
  • 2020-07-19
  • 2016-08-21
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 2016-10-04
  • 2017-12-27
相关资源
最近更新 更多