廖雪峰的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出来的一个值进行了过滤,那么为什么最后可以得到通过了所有筛选条件的无限列表?
filter和map是类似的,返回的也是一个迭代器,对传入的可迭代对象的每一项用指定的函数进行筛选,转化为list或者使用for循环就会一次性对每一项进行筛选,你可以试一试这一段代码