欢迎光临散文网 会员登陆 & 注册

求素数实例详解

2021-09-07 10:44 作者:海鸥之道  | 我要投稿

求素数源码如下:

解析:

重点掌握:

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次也是同理。



    






求素数实例详解的评论 (共 条)

分享到微博请遵守国家法律