python - Python 中 Eratosthenes 的惰性筛选

标签 python python-3.x generator

我正在尝试在 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/

相关文章:

python - 如何识别图中未连接的 sibling ?

python - 电子邮件中的编码问题

python - MAP 的意外结果

python - 对字典使用列表理解时出现语法错误

python - 为什么keras序列的一个实例会永远迭代?

iterator - 迭代器和生成器有什么区别?

python - gmail api 给出 failedPrecondition 错误

python - 从字符串的开头删除 n 个字符

linux - new Fedora 27 中/usr/bin/python3 中的符号查找错误 "_Py_CoerceLegacyLocale"

list - 使用 Scala 中的函数生成的值生成列表