【问题标题】:Python: Why does this generator not continue from yield?Python:为什么这个生成器不能从 yield 继续?
【发布时间】:2020-07-01 01:32:17
【问题描述】:

我试图在 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 继续,因为它是一个生成器吗?

【问题讨论】:

  • 您的else 似乎没有正确的缩进级别。
  • 顺便说一句,否则是 LOOP 之后允许的关键字。这就是为什么你不会出错。
  • @John 我认为 OP 打算这样做。这是一个 for/else 构造。我对其进行了测试,代码按原样运行,但如果您“修复”它,则不会。
  • @BrianMcCutchon 好点。鉴于 for ... elseif ... else 相比的稀有性,这似乎是一个不错的猜测。

标签: python while-loop generator


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    然后你会得到你所期望的

    【讨论】:

      【解决方案3】:

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

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

      所以每次创建一个新对象并打印该新对象时,这就是为什么每次都将 2 作为输出。

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

      【讨论】:

        猜你喜欢
        • 2017-11-18
        • 2020-04-07
        • 2016-12-02
        • 2016-08-19
        • 2019-04-03
        • 2016-12-02
        • 2020-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多