提问人:BENG 提问时间:7/1/2020 更新时间:7/1/2020 访问量:444
Python:为什么这个生成器不能从产量继续?
Python: Why does this generator not continue from yield?
问:
我试图在python中制作一个素数生成器,但我遇到了一个问题。这是我的代码
def prime_generator():
n = 2
while n < 100:
for i in range(2, n):
if n % i == 0:
break
else:
yield n
n += 1
我认为这应该产生小于 100 的质数。它由一个 while 循环组成,该循环从 2 开始接受 n,并使用 for 循环来决定它是否为素数。如果 n 不是素数,则将 n 递增 1 并继续循环,直到产生素数 n。
但是,每当我多次运行时,我都会得到一堆 2 作为输出。通过调试器单步执行它,我注意到每次 python 运行时,它都会重新启动生成器并重置 n = 2,而不是离开,然后应该增加 n 并继续 while 循环。为什么会重启?它不应该从产量继续,因为它是发电机吗?print(next(prime_generator()))
next(prime_generator())
yield n
答:
调用会创建生成器,因此您每次都会创建生成器。相反,请执行以下操作:prime_generator()
pg = prime_generator()
print(next(pg))
print(next(pg))
print(next(pg))
然后你会得到你所期望的
您需要重用生成器,而不是每次都创建一个新生成器。
primes = prime_generator()
print(next(primes))
print(next(primes))
每次调用都会打印 2,这意味着每次运行它时,您都会创建一个新的生成器对象,该对象相当于print(next(prime_generator()))
obj1 = prime_generator(), obj2=prime_generator()
...等等
因此,每次创建新对象并打印该新对象时,这就是为什么每次都获得 2 作为输出的原因。
要解决此问题,请调用 Generator 对象一次 AS,然后继续执行,直到到达最后一个质数,以便一次性获得所有可以使用的质数。object = prime_generator()
print(next(object))
all_prime = list(object)
评论
else
for ... else
if ... else