Python:なぜこのジェネレータは収量から継続しないのですか?

2020-07-01 python while-loop generator

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未満の素数を生成するはずだと思いました。これは、2から始まるnを取るwhileループで構成され、forループを使用して素数かどうかを判断します。 nが素数でない場合は、 nを1増やし、素数nが得られるまでループを継続します。

ただし、 print(next(prime_generator()))複数回実行すると、出力として2の束が得られます。デバッガもそれをステッピング、私はすべての時間Pythonが実行されますことに気づいたnext(prime_generator()) 、それは発電機を再起動なり、n = 2の代わりにオフのままリセットyield nれるべきその後の増分nおよびWhileループを継続します。なぜ再起動するのですか?それは発電機なので、収量から続けるべきではありませんか?

Answers

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))続け、1回の移動ですべての素数を取得するには、 all_prime = list(object)使用できます。

Related