Python中Eratosthenes的懒惰筛子

mkc*_*kcs 6 python generator python-3.x

我试图在Python 3.2中编写一个懒惰版的Eratosthenes Sieve.这是代码:

import itertools
def primes():
    candidates = itertools.count(2)
    while True:
        prime = next(candidates)
        candidates = (i for i in candidates if i % prime)
        yield prime
Run Code Online (Sandbox Code Playgroud)

但是,当我遍历primes()时,我只能得到连续的数字.例如,

print(list(itertools.islice(primes(),0,10)))
Run Code Online (Sandbox Code Playgroud)

打印列表

[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,对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
Run Code Online (Sandbox Code Playgroud)

我猜我错过了关于发生器参数范围的一些信息

candidates = (i for i in candidates if i % prime)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何修改代码而不添加这个随机的新行.有谁知道我做错了什么?谢谢.

Dan*_* D. 6

修复真的要替换:

candidates = (i for i in candidates if i % prime)
Run Code Online (Sandbox Code Playgroud)

有:

candidates = (lambda prime: (i for i in candidates if i % prime))(prime)
Run Code Online (Sandbox Code Playgroud)

  • -1 Dude,以这种方式构建lambda函数是完全错误的. (2认同)