我正在使用 Python 生成器和itertools
模块,并尝试制作无限版本的埃拉托色尼筛。这是我的代码:
from itertools import count, ifilter, islice
def sieve_broken():
candidates = count(start=2)
while True:
prime = next(candidates)
yield prime
candidates = ifilter(lambda n: n % prime, candidates)
当我测试它时,我得到了这个:
>>> print list(islice(sieve_broken(), 10))
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
但是如果我用candidates
这样的函数替换重新分配:
def sieve_fixed():
def exclude_multiples(factor, numbers):
return ifilter(lambda n: n % factor, numbers)
candidates = count(start=2)
while True:
prime = next(candidates)
yield prime
candidates = exclude_multiples(prime, candidates)
我得到:
>>> print list(islice(sieve_fixed(), 10))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
我无法弄清楚为什么第一个版本不起作用。据我所知,这两个版本应该是等价的。有谁知道为什么他们不一样?