繁体   English   中英

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 作为 output。 通过调试器单步执行它,我注意到每次 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 意味着每次运行它时,您正在创建一个新的生成器 object ,它相当于

obj1 = prime_generator(), obj2=prime_generator() ... 以此类推

因此,每次创建新的 object 并且您正在打印新的 object 时,这就是为什么您每次都获得 2 作为 output 的原因。

为了解决这个问题,调用生成器 object 一次作为object = prime_generator()然后继续执行print(next(object))直到你到达最后一个素数,在一个单一的 Z34D1F91FB2E514B8576ZFAB1A 中获取所有素数你可以使用all_prime = list(object)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM