Python用filter求素数

发布于 2022-09-07 15:35:49 字数 750 浏览 26 评论 0

廖雪峰的Python教程中关于使用filter求素数的例子不太明白,

def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n

def _not_divisible(n):
    return lambda x: x%n > 0

def primes():
    yield 2
    it = _odd_iter();
    while True:
        n = next(it)
        yield n
        it = filter(_not_divisible(n), it) #疑问
for n in primes():
    if n < 30:
        print(n)
    else:
        break

关于这句it = filter(_not_divisible(n), it),既然it是一个iterator那就是惰性计算的,那么每次运行到这句时,filter只是对it代表的无限列表的当前yield出来的一个值进行了过滤,那么为什么最后可以得到通过了所有筛选条件的无限列表?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心清如水 2022-09-14 15:35:49

filter和map是类似的,返回的也是一个迭代器,对传入的可迭代对象的每一项用指定的函数进行筛选,转化为list或者使用for循环就会一次性对每一项进行筛选,你可以试一试这一段代码

for x in filter(lambda x % 2 == 0, range(10)):
    print(x)
沉睡月亮 2022-09-14 15:35:49

按照官方文档所说的:
filter(function, iterable)等价于(item for item in iterable if function(item))

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文