【发布时间】:2011-07-16 03:54:45
【问题描述】:
我正在尝试在 Python 3.2 中编写一个惰性版本的 Sieve of Eratosthenes。代码如下:
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)
但是如果不添加这个看起来随机的新行,我看不到如何修复代码。有人知道我做错了什么吗?谢谢。
【问题讨论】:
-
请注意
next(itertools.tee(candidates)[1])可以重写为next(candidates)或在python 2 中candidates.next()。 -
prime是否只绑定一次而不是每次循环迭代,这意味着它不会像预期的那样在每个生成器中保持不变?
标签: python python-3.x generator