我正在尝试在 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
但是,当我迭代 primes() 时,我只得到连续的数字。例如,
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)
但我看不出如何在不添加这个看似随机的新行的情况下修复代码。有人知道我做错了什么吗?谢谢。
最佳答案
真正的修复是替换:
candidates = (i for i in candidates if i % prime)
与:
candidates = (lambda prime: (i for i in candidates if i % prime))(prime)
关于python - Python 中 Eratosthenes 的惰性筛选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6715197/