首页 > 解决方案 > Python:为什么这个生成器不能从 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()))多次运行时,我只会得到一堆 2s 作为输出。通过调试器单步执行它,我注意到每次 python 运行next(prime_generator())它都会重新启动生成器并重置n = 2 而不是离开yield n它,然后应该增加n并继续 while 循环。为什么会重启?它不应该从 yield 继续,因为它是一个生成器吗?

标签: pythonwhile-loopgenerator

解决方案


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

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

然后你会得到你所期待的


推荐阅读