一旦我使用了一个生成器,它就不能再使用了。为什么会这样呢?
考虑以下代码:
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内置的,但是为什么是这样呢?只允许一个生成器对象执行一次有什么特别的原因吗?
发布于 2018-06-26 05:42:27
发电机的工作原理就像是自动收报机的磁带。当您对它调用next
时,它会给出下一个数字,但随后它会忘记它,这与列表不同。这就是大部分效率的来源。因为它不必记住它以前的值是什么,所以内存占用要小得多(特别是当不是所有的值最终都需要的时候!)
一些生成器也许可以重置以能够再次运行,但这并不能保证,如果您尝试这样做,一些生成器将完全失败。Python不是一种纯语言,因此您可能有生成器在生成值的同时修改状态。例如,生成器如下所示:
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的初始状态,然后有一种方法将其种子设置回初始状态。这当然是可行的,但生成器的工作不是知道它的底层实现如何修改状态。
https://stackoverflow.com/questions/51032155
复制相似问题