我正试图用python 3.2编写一个懒惰版本的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)

但是我看不到如何在不添加这个看起来随机的新行的情况下修复代码。有人知道我做错了什么吗?谢谢。

最佳答案

修复方法实际上是替换:

candidates = (i for i in candidates if i % prime)

用:
candidates = (lambda prime: (i for i in candidates if i % prime))(prime)

07-26 03:46