迭代器結(jié)合filter求素數(shù)

素數(shù)原理:

1坦喘、列出從2開始的所有自然數(shù)原押,構(gòu)造出一個序列(迭代器生成)
2,3,4,5,6,7,8,9,......
2由蘑、取出序列的第一個數(shù)2,它一定是素數(shù)啊楚,然后用2把序列中2的倍數(shù)篩掉
3,4,5,6,7,8,9,...
3、取新的序列第一個數(shù)3,然后把序列中3的倍數(shù)篩掉
5,6,7,8,9,10,11,12,...
4电谣、取新序列的第一個數(shù)5,然后用5把序列的5倍數(shù)篩掉
6,7,8,9,10,11,12,13,14,15,...

使用Python來實現(xiàn)這個算法

#定義獲取所有奇數(shù)的迭代器
def _odd_iter():
   m = 1
   while True:
        m = m + 2
        yield m

#定義匿名篩選函數(shù)  
def _not_divisible(y):
    #該匿名函數(shù)f(x)功能是數(shù)x如果不被y取整(整除)秽梅,返回true,否則返回false
    return lambda x:x % y > 0

#定義一個素數(shù)生成器,每迭代一次返回一個素數(shù)
def primes():
 yield 2  #返回第一個素數(shù)2
 it = _old_iter()  #初始化奇數(shù)序列,該序列元素類似(3,5,7,9,11,....)
 while True:
    y = next(it) #獲取序列第一個元素
    yield y  #返回系列第一個元素
    it = filter(_not_divisible(y), it)   #參考下面運行流程

for k in primes():
  if k < 50:
    print(k)
  else:
    break

運行流程如下:

primes是一個迭代器辰企,每一次循環(huán)只獲取一個數(shù)據(jù)(yield返回值)

初始迭代器 it = _old_iter() #it:3,5,7,9,11,...

1风纠、第一輪執(zhí)行

y = next(it)        #獲取的第一個元素為3
yield y  #返回數(shù)字3    

2、第二輪執(zhí)行

#第一輪    y=3
#新的迭代器it變更為下面這個fliter迭代器, 舊的it當(dāng)執(zhí)行next之后3被取出,剩下的就是(5,7,9,11,...)
#f(x%3)即上面的那個匿名函數(shù),不被3整除的數(shù)字x
it1 = filter(f(x%3), it)  
    = filter(f(x%3), (5,7,9,11,...))
#執(zhí)行獲取下一個元素,從迭代器it1中獲取牢贸。
#流程:
     a)取迭代器it第一個數(shù)字,得到5
     b)執(zhí)行filter中的匿名函數(shù)f(x%3)=f(5%3)=2為True竹观,返回該數(shù)5
y = next(it1)  = 5
yield y  #返回數(shù)字5

3、第三輪執(zhí)行

# 第二輪 y = 5
# 新的迭代器it變更為下面的filter迭代器
#f(x%5)即上面的那個匿名函數(shù),不被5整除的數(shù)字x
#注意,最原始的it迭代器已經(jīng)把3,5給獲取了,剩下的就是it=(7,9,11,13,15,...)
it2 = filter(f(x%5), it1) 
= fliter(f(x%5),  filter(f(x%3), it) 
= fliter(f(x%5),  filter(f(x%3), (7,9,11,13,15,...))
#執(zhí)行獲取下一個元素,從迭代器it2中獲取潜索。
#流程:
    a)取迭代器it第一個數(shù)字,得到7
    b)執(zhí)行內(nèi)存fliter中的匿名函數(shù)f(x%3)=f(7%3)=1=True,返回數(shù)字7
    c)繼續(xù)執(zhí)行外層fliter中的匿名函數(shù)f(x%5)=f(7%5)=2=True,返回數(shù)字7
y = next(it2)=7
yield y #返回結(jié)果7

4臭增、第四輪執(zhí)行

 #第三輪 y=7
 #新的迭代器it變更為下面的filter迭代器
 #f(x%7)即上面的那個匿名函數(shù),不被7整除的數(shù)字x
 #原始迭代器it=(9,11,13,15,...)
 it3 = filter(f(x%7),  it2)
     = fliter(f(x%7), filter(f(x%5), it1))
     = filter(f(x%7), filter(f(x%5), filter(f(x%3), it)
     = filter(f(x%7), filter(f(x%5), filter(f(x%3), (9,11,13,15,...)))
 #執(zhí)行獲取下一個元素,從迭代器it3中獲取。
 #流程:
   a)取迭代器it第一個數(shù)字,得到9
   b)執(zhí)行最內(nèi)層filter篩選器中函數(shù)f(x%3)=f(9%3)=0=False,  9不符合要求被丟棄,迭代器it變?yōu)?11,13,15,...)
   c)繼續(xù)獲取迭代器it的第一個元素11
   d)執(zhí)行最內(nèi)層filter篩選器中函數(shù)f(x%3)=f(11%3)=2=True,返回結(jié)果11到第二層filter
   e)執(zhí)行第二層filter篩選器函數(shù)f(x%5)=f(11%5)=1=True,返回結(jié)果11到第三層(最外層)fliter
   f)執(zhí)行第三層filter篩選器函數(shù)f(x%7)=f(11%7)=4=True,返回結(jié)果11給y
   y = next(it3)=11
   yield y #返回結(jié)果11

5竹习、第五輪執(zhí)行

  #第四輪 y=11
  #新的迭代器
  it4 = filter(f(x%11), it3)
      = filter(f(x%11), filter(f(x%7),  it2))
      = filter(f(x%11), filter(f(x%7),  filter(f(x%5), it1)))
      = filter(f(x%11), filter(f(x%7),  filter(f(x%5), filter(f(x%3), it)))
      = filter(f(x%11), filter(f(x%7),  filter(f(x%5), filter(f(x%3), (13,15,17,19,....))))
  ....參照第四輪執(zhí)行過程

6誊抛、循環(huán)執(zhí)行.....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市整陌,隨后出現(xiàn)的幾起案子拗窃,更是在濱河造成了極大的恐慌瞎领,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件随夸,死亡現(xiàn)場離奇詭異九默,居然都是意外死亡,警方通過查閱死者的電腦和手機宾毒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門驼修,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诈铛,你說我怎么就攤上這事乙各。” “怎么了幢竹?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵耳峦,是天一觀的道長。 經(jīng)常有香客問我妨退,道長妇萄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任咬荷,我火速辦了婚禮,結(jié)果婚禮上轻掩,老公的妹妹穿的比我還像新娘幸乒。我一直安慰自己,他們只是感情好唇牧,可當(dāng)我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布罕扎。 她就那樣靜靜地躺著,像睡著了一般丐重。 火紅的嫁衣襯著肌膚如雪腔召。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天扮惦,我揣著相機與錄音臀蛛,去河邊找鬼。 笑死崖蜜,一個胖子當(dāng)著我的面吹牛浊仆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豫领,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼抡柿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了等恐?” 一聲冷哼從身側(cè)響起洲劣,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤备蚓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后囱稽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體星著,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年粗悯,在試婚紗的時候發(fā)現(xiàn)自己被綠了虚循。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡样傍,死狀恐怖横缔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衫哥,我是刑警寧澤茎刚,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站撤逢,受9級特大地震影響膛锭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚊荣,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一初狰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧互例,春花似錦奢入、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糊秆,卻和暖如春武福,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痘番。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工捉片, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夫偶。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓界睁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兵拢。 傳聞我的和親對象是個殘疾皇子翻斟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 對哥德巴赫猜想的證明 提出論點:組數(shù)階乘法,能證明任何一個大于2的偶數(shù)都能等于兩個素數(shù)之和 設(shè)A為偶數(shù)说铃,分解質(zhì)因數(shù)...
    行者石頭閱讀 1,773評論 0 0
  • 【1】7访惜,9嘹履,-1,5债热,( ) A砾嫉、4;B窒篱、2焕刮;C、-1墙杯;D配并、-3 分析:選D,7+9=16高镐;9+(-1)=8溉旋;(...
    Alex_bingo閱讀 18,979評論 1 19
  • 什么是素數(shù) 素數(shù)又稱質(zhì)數(shù),是指大于1的自然數(shù)中嫉髓,除了1和它本身观腊,不能被其它自然數(shù)整除的數(shù)字。1被定義為非素數(shù)算行。大于...
    程點閱讀 7,217評論 1 7
  • 數(shù)組的方法 splice()可以刪除梧油、插入、替換數(shù)組中的元素纱意,可以接受1個參數(shù)婶溯、2個參數(shù)或者3個參數(shù),返回值是刪除...
    謝謝_d802閱讀 94評論 0 0
  • 適配器在生活中很常見偷霉,例如電源適配器、USB串口轉(zhuǎn)接設(shè)備等褐筛,它們本質(zhì)上是完成接口轉(zhuǎn)換的功能类少。在編程領(lǐng)域上,模擬適配...
    solorhyme閱讀 268評論 0 1