Python: 为什么这个生成器不从 yield 继续?

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 循环,该循环采用 n,从 2 开始,并使用 for 循环来决定是否它是否是质数。如果 n 不是素数,它将 n 递增 1 并继续循环,直到它产生一个素数 n.

但是,每当我 运行 print(next(prime_generator())) 多次时,我只会得到一堆 2 作为输出。通过调试器步进它,我注意到每次 python 会 运行 next(prime_generator()) 它会重新启动生成器并重置 n = 2 而不是离开从 yield n 关闭,然后应该增加 n 并继续 while 循环。为什么会重启?因为它是生成器,所以它不应该从 yield 继续吗?

调用 prime_generator() 会创建生成器,因此您每次都会创建一个生成器。相反,这样做:

pg = prime_generator()
print(next(pg))
print(next(pg))
print(next(pg))

那么你会得到你所期待的

您需要重复使用生成器,而不是每次都创建一个新的生成器。

primes = prime_generator()
print(next(primes))
print(next(primes))

每次调用 print(next(prime_generator())) 导致每次打印 2 意味着每次你 运行 这,你正在创建一个新的生成器对象,它等同于

obj1 = prime_generator(), obj2=prime_generator() ...等等

因此,每次创建一个新对象并打印该新对象时,这就是每次输出 2 的原因。

为了解决这个问题,调用生成器对象一次 object = prime_generator() 然后继续 print(next(object)) 直到你到达最后一个素数,要一次获得所有素数,你可以使用 all_prime = list(object).