Я пытаюсь закодировать ленивую версию Решета Эратосфена в Python 3.2. Вот код:
import itertools
def primes():
candidates = itertools.count(2)
while True:
prime = next(candidates)
candidates = (i for i in candidates if i % prime)
yield prime
Однако , когда я перебираю простые числа (), я получаю только последовательные числа. Например,
print(list(itertools.islice(primes(),0,10)))
печатает список
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
К моему удивлению, следующая крошечная модификация primes () заставляет его работать:
def primes():
candidates = itertools.count(2)
while True:
prime = next(candidates)
candidates = (i for i in candidates if i % prime)
next(itertools.tee(candidates)[1]) ########### NEW LINE
yield prime
Я предполагаю, что я что-то отсутствует в области параметров генератора
candidates = (i for i in candidates if i % prime)
, но я не вижу, как исправить код, не добавляя эту новую строку, которая выглядит случайным образом. Кто-нибудь знает, что я делаю неправильно? Спасибо.