Ленивое Сито Эратосфена в Python

Я пытаюсь закодировать ленивую версию Решета Эратосфена в 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)

, но я не вижу, как исправить код, не добавляя эту новую строку, которая выглядит случайным образом. Кто-нибудь знает, что я делаю неправильно? Спасибо.

6
задан juanpa.arrivillaga 20 April 2018 в 07:36
поделиться