为什么python生成器只能使用一次?

时间:2018-06-25 21:40:29

标签: python generator

一旦我使用过一次生成器,就不能再使用它。为什么会这样?

考虑以下代码:

def generator(n):
  a = 1

  for _ in range(n):
    yield a
    a += 1

def run_generator(generator):
  for a in generator:
    print(a, end = " ")

如果我要执行此操作:

count_generator = generator(10)
run_generator(count_generator)
run_generator(count_generator)

它只会打印:

1 2 3 4 5 6 7 8 9 10

基本上,生成器仅在执行一次后就死掉。

我知道生成器只能使用一次的事实是Python内置的东西,但是为什么会这样呢?是否有特定的原因只允许生成器对象执行一次?

1 个答案:

答案 0 :(得分:0)

生成器的工作原理类似于股票报价。当您在其上拨打next时,它会给您下一个号码,但是与列表不同,它会忘记。这就是大多数效率的来源。由于它不必记住以前的值,因此内存占用量要小得多(尤其是当并非最终需要所有值时!)

也许可以重置某些生成器以使其再次运行,但这绝不能保证,如果尝试这样做,某些生成器将彻底失败。 Python不是 pure 语言,因此您可能会有生成器在生成值时修改状态。例如,生成器,例如:

def gimme_randoms():
    while True:
        yield random.random()

我可以称之为一堆,但是random中PRNG后面的状态每次都会改变。

rs = gimme_randoms()
a = next(rs)
b = next(rs)
c = next(rs)  # some numbers

重置此状态意味着什么?好吧,您期望:

rs2 = gimme_randoms()
x = next(rs2)
y = next(rs2)
z = next(rs2)

assert a == x and b == y and c == z  # Nonsense!

要保持这种状态,您必须跟踪PRNG的初始状态,然后才能将其种子设置回初始状态。这肯定是可行的,但不是生成器的 job 知道其底层实现如何修改状态。