Python用filter求素数

廖雪峰的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出来的一个值进行了过滤,那么为什么最后可以得到通过了所有筛选条件的无限列表?

阅读 4.2k
2 个回答

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

for x in filter(lambda x % 2 == 0, range(10)):
    print(x)

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题