Python:为什么这个生成器不能从产量继续?

Python: Why does this generator not continue from yield?

提问人:BENG 提问时间:7/1/2020 更新时间:7/1/2020 访问量:444

问:

我试图在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

python while-loop 生成器

评论

2赞 John Coleman 7/1/2020
您的缩进水平似乎不合适。else
1赞 Cheche 7/1/2020
顺便说一句,else 是 LOOP 之后允许的关键字。这就是为什么你不会出错。
2赞 Brian McCutchon 7/1/2020
@John我认为OP是有意为之的。这是一个 for/else 结构。我测试了它,代码按原样工作,但如果你“修复”它,就不能了。
0赞 John Coleman 7/1/2020
@BrianMcCutchon 好点子。鉴于与它相比的稀有性,这似乎是一个不错的猜测。for ... elseif ... else

答:

0赞 damores 7/1/2020 #1

调用会创建生成器,因此您每次都会创建生成器。相反,请执行以下操作:prime_generator()

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

然后你会得到你所期望的

0赞 Brian McCutchon 7/1/2020 #2

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

primes = prime_generator()
print(next(primes))
print(next(primes))
0赞 sahasrara62 7/1/2020 #3

每次调用都会打印 2,这意味着每次运行它时,您都会创建一个新的生成器对象,该对象相当于print(next(prime_generator()))

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

因此,每次创建新对象并打印该新对象时,这就是为什么每次都获得 2 作为输出的原因。

要解决此问题,请调用 Generator 对象一次 AS,然后继续执行,直到到达最后一个质数,以便一次性获得所有可以使用的质数。object = prime_generator()print(next(object))all_prime = list(object)