求素?cái)?shù)實(shí)例詳解
求素?cái)?shù)源碼如下:
解析:
重點(diǎn)掌握:
1、filter()
也接收一個(gè)函數(shù)和一個(gè)序列。根據(jù)返回值得True和False決定值得去留。
2、lambda x: x % n > 0;等價(jià)于
3、filter()
函數(shù)返回的是一個(gè)Iterator
,也就是一個(gè)惰性序列,在filter前面沒有l(wèi)ist 或者沒有用next()調(diào)用時(shí),它只是一個(gè)生成對(duì)象。
下面我們逐條分析:
程序首先執(zhí)行這句,進(jìn)入primes()函數(shù):

第一次運(yùn)行:
it = filter(_not_divisible(n),it) ,此時(shí),n=3, it =?_odd_iter()
相當(dāng)于:?it = filter(_not_divisible(3),_odd_iter())? ?,此時(shí)由于filter前面沒有l(wèi)ist且沒有next調(diào)用,所示it 此時(shí)就是一個(gè)生成器,里面的內(nèi)容沒有執(zhí)行;直到程序通過while循環(huán),再一次執(zhí)行:

第二次運(yùn)行:
n = next(it) ,此時(shí)?it = filter(_not_divisible(3),_odd_iter())? ,于是先運(yùn)行
1)next(_odd_iter()),_odd_iter()這是第二次調(diào)用,第一次拋出3,第二次拋出5,停滯等待下次調(diào)用,切記。
2)此時(shí),?it = filter(_not_divisible(3),[5]) ,???n = next(it) ,? ?即篩選:
it = filter(lambda x: x % 3 > 0,[5])? ,得出 n = 5
記住此時(shí)it的值:?it = filter(_not_divisible(3),_odd_iter()) 且?_odd_iter()調(diào)用了兩次
3)程序繼續(xù)運(yùn)行: yield n? ?#拋出此時(shí)n的值 為 5
4)最后一句賦值 it =?filter(_not_divisible(n),it) , 此時(shí)括號(hào)里面的n=5,?it值參考 ‘’2) ‘’為:
????it =?filter(_not_divisible(3),_odd_iter()) ,那么這句話整句表達(dá)式如下:
?it =?filter(_not_divisible(5),?filter(_not_divisible(3),_odd_iter()))?
第三次運(yùn)行:
n = next(it) , 此時(shí)?it =?filter(_not_divisible(5),?filter(_not_divisible(3),_odd_iter()))?
1)還是先運(yùn)行:next(_odd_iter())?_odd_iter()這是第三次調(diào)用,第一次拋出3,第二次拋出5,第三次拋出7,停滯等待
2)此時(shí)表達(dá)式為:??it =?filter(_not_divisible(5),?filter(_not_divisible(3),[7]))? ,執(zhí)行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
也就是說,相當(dāng)于 當(dāng)前值7 ,對(duì)之前n的取值 3、5都做取余運(yùn)算,滿足余數(shù)不為0,拋出顯示,否則舍棄。
第四次運(yùn)行:
相當(dāng)于 當(dāng)前值 9, 對(duì)n之前的值 3,5,7都做取余運(yùn)算, 若余數(shù)都不為0,則拋出顯示,顯然9%3==0,所以9被舍棄,下面運(yùn)行1000次也是同理。
????