求素数实例详解
求素数源码如下:
解析:
重点掌握:
1、filter()
也接收一个函数和一个序列。根据返回值得True和False决定值得去留。
2、lambda x: x % n > 0;等价于
3、filter()
函数返回的是一个Iterator
,也就是一个惰性序列,在filter前面没有list 或者没有用next()调用时,它只是一个生成对象。
下面我们逐条分析:
程序首先执行这句,进入primes()函数:

第一次运行:
it = filter(_not_divisible(n),it) ,此时,n=3, it = _odd_iter()
相当于: it = filter(_not_divisible(3),_odd_iter()) ,此时由于filter前面没有list且没有next调用,所示it 此时就是一个生成器,里面的内容没有执行;直到程序通过while循环,再一次执行:

第二次运行:
n = next(it) ,此时 it = filter(_not_divisible(3),_odd_iter()) ,于是先运行
1)next(_odd_iter()),_odd_iter()这是第二次调用,第一次抛出3,第二次抛出5,停滞等待下次调用,切记。
2)此时, it = filter(_not_divisible(3),[5]) , n = next(it) , 即筛选:
it = filter(lambda x: x % 3 > 0,[5]) ,得出 n = 5
记住此时it的值: it = filter(_not_divisible(3),_odd_iter()) 且 _odd_iter()调用了两次
3)程序继续运行: yield n #抛出此时n的值 为 5
4)最后一句赋值 it = filter(_not_divisible(n),it) , 此时括号里面的n=5, it值参考 ‘’2) ‘’为:
it = filter(_not_divisible(3),_odd_iter()) ,那么这句话整句表达式如下:
it = filter(_not_divisible(5), filter(_not_divisible(3),_odd_iter()))
第三次运行:
n = next(it) , 此时 it = filter(_not_divisible(5), filter(_not_divisible(3),_odd_iter()))
1)还是先运行:next(_odd_iter()) _odd_iter()这是第三次调用,第一次抛出3,第二次抛出5,第三次抛出7,停滞等待
2)此时表达式为: it = filter(_not_divisible(5), filter(_not_divisible(3),[7])) ,执行next(it),即 : it = filter(lambda x: x % 5 > 0, filter(lambda x: x % 3 > 0,[7]))
===> it = filter(lambda x: x % 5 > 0, [7]))
===> next(it) = 7
也就是说,相当于 当前值7 ,对之前n的取值 3、5都做取余运算,满足余数不为0,抛出显示,否则舍弃。
第四次运行:
相当于 当前值 9, 对n之前的值 3,5,7都做取余运算, 若余数都不为0,则抛出显示,显然9%3==0,所以9被舍弃,下面运行1000次也是同理。