这里的原理是通过“埃氏筛法”过滤
#先定义个大于1的无限奇数列表:
#!/usr/bin/python3.5
# -*- coding=utf-8 -*-
def odd_num():
n=1
while True:
n = n + 1
yield n
#定义个过滤器:
def _Filter(n):
return lambda x:x%n>0
# 素数过滤主函数
def primes():
yield 2 #把特殊素数 2打印出来
it=odd_num() #一个除了1外的所有奇数(生成器)
while True:
n=next(it) #这里是非常巧妙的用法,根据 "埃氏过滤" ,列表的第一个数一定是“素数",第一次循环为3
yield n #把’列表‘第一个数打印出来,因为埃氏规则,列表第一个数肯定是素数
it=filter(_Filter(n),it) # _Filter(n) 函数是一个二层嵌套函数,只不过第二层为一个lambda匿名函数,当生成器的第一个数3被打印出后,3作为参数传递给了_Filter 函数,
#如果把匿名函数写成等同的正常函数,那个么_Filter函数可以写成如下:
_Fiter(n):
f1(x):
return x%n>0
return f1
所以3传递过来后,就变成了
f1(x):
return x%3>0
这个函数和生成器对象it 一块传递给了 过滤函数filter(),filter 函数会作把函数f1作用于后面it 生成器上,把it生成器能被3整除的数全部过滤掉,结果重新复制给 it
再次循环的时候,it生成器的经过3的过滤后,剩下第一个数为5(符合埃氏规则,为素数),通过yield n 打印出 5,然后过滤函数变成了
f1(x):
return x%5>0
通过 filter函数通过f1再次对经过3过滤后的生成器it过滤一次。然后把过滤后的结果再次赋值给it,此时it第一数值变成了7,打印出来,反复循环,打印出所有的素数,这个是无限的,通过条件判断取有限的个数。
请注意,这几个高阶函数只有filter可以作用于生成器,其他几个都不行