Python生成器——懶到欠揍掖疮,但很經(jīng)濟(jì)

生成器的特點(diǎn)是工作到一半,就會(huì)停下來(lái)看別人干活直至有人踢它屁股颗祝,這時(shí)它才繼續(xù)往下干活浊闪。實(shí)現(xiàn)這一功能的精髓要用到y(tǒng)ield。

生成器是一種特殊的迭代器螺戳,因此我們先來(lái)了解一下什么是迭代器规揪。我們都知道著名的斐波那契數(shù)列:1、1温峭、2、3字支、5凤藏、8奸忽、13、21揖庄、34……從第三個(gè)數(shù)開(kāi)始栗菜,每個(gè)數(shù)都可以由其前面的兩個(gè)數(shù)相加得到,這就是一個(gè)迭代過(guò)程蹄梢。很顯然疙筹,這是一個(gè)不收斂的數(shù)列,我們無(wú)法用列表或者使集合去一次性將它們提取出來(lái)禁炒。這時(shí)候而咆,如果我們把這樣一個(gè)迭代過(guò)程封裝成一個(gè)迭代器,只有在調(diào)用一次它的時(shí)候它才進(jìn)行一次迭代幕袱,并且只保留當(dāng)前的迭代結(jié)果暴备,這樣一來(lái),程序的運(yùn)行速度能得到提高们豌,同時(shí)也不會(huì)對(duì)內(nèi)存造成嚴(yán)重的負(fù)擔(dān)涯捻。迭代器可以表示一個(gè)無(wú)限大的數(shù)據(jù)流,也可以表示一個(gè)有限的數(shù)據(jù)流望迎。

從代碼的角度講障癌,所有可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象就叫做迭代器:Iterator。與迭代器相近的一個(gè)概念是可迭代對(duì)象(Iterable)辩尊,凡是可用for循環(huán)遍歷的對(duì)象都是可迭代對(duì)象涛浙,比如list、dict和str等对省。但是這幾個(gè)對(duì)象不是迭代器蝗拿,這一點(diǎn)在上一段已經(jīng)從迭代器的特點(diǎn)說(shuō)明,不再贅述蒿涎。然而哀托,世事無(wú)絕對(duì),通過(guò)iter()函數(shù)劳秋,可以將它們變成迭代器仓手。

由此,我們可以建立這樣一個(gè)斐波那契數(shù)列生成器:

def generate():
    b,c = 0,1
    while True:  
        b,c = c,b +c  #迭代公式
        yield c
    return "fault"  #出錯(cuò)時(shí)的返回值

y = generate()   #產(chǎn)生一個(gè)生成器對(duì)象玻淑,但不調(diào)用生成器
for i in range(15):  #調(diào)用15次
    print(y.__next__(),end="  ")  #使用next()方法調(diào)用生成器

yield的作用是讓生成器在這里暫停執(zhí)行嗽冒,執(zhí)行下一條程序指令。當(dāng)下一次調(diào)用next()函數(shù)時(shí)补履,生成器從暫停的地方繼續(xù)往下執(zhí)行添坊。一次,每調(diào)用一次產(chǎn)生一個(gè)值箫锤,調(diào)用15次產(chǎn)生15個(gè)值贬蛙,如下圖所示:


斐波那契數(shù)列

這種類型的生成器并不需要參數(shù)雨女,當(dāng)我們需要給生成器內(nèi)部傳遞參數(shù)時(shí),我們需要用到send()函數(shù)阳准,因?yàn)閚ext()函數(shù)不具備該功能氛堕。看下面這樣一段代碼:

def sing(word1):
    print(word1)
    while True:
        word2 = yield  #每次調(diào)用時(shí)生成器都停留在這里
        print(word2)


a = sing("如今走過(guò)這世間")
a.send(None)  #可以替換成a.__next__()
a.send("萬(wàn)般流連")

上述代碼野蝇,如果不用while循環(huán)讼稚,則沒(méi)辦法使每次調(diào)用的結(jié)果程序都停留在yield這里,而是執(zhí)行完print(word2)變結(jié)束了绕沈,這使程序會(huì)報(bào)錯(cuò)锐想。在第一次使用需要傳遞參數(shù)的生成器時(shí),我們不能直接使用send()函數(shù)傳遞我們想傳遞的參數(shù)七冲,因?yàn)榇藭r(shí)函數(shù)停在yeild痛倚,并不需要到這個(gè)參數(shù)。因此我們可以用next()函數(shù)來(lái)進(jìn)行第一次調(diào)用澜躺,然后再調(diào)用send()傳遞參數(shù)并調(diào)用蝉稳。當(dāng)然,如果我們非要用send()函數(shù)實(shí)現(xiàn)第一次調(diào)用時(shí)掘鄙,應(yīng)該傳遞一個(gè)空參數(shù)耘戚。運(yùn)行結(jié)果如下所示:


運(yùn)行效果

至此,大功告成操漠!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末收津,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浊伙,更是在濱河造成了極大的恐慌撞秋,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚣鄙,死亡現(xiàn)場(chǎng)離奇詭異吻贿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)哑子,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門舅列,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卧蜓,你說(shuō)我怎么就攤上這事帐要。” “怎么了弥奸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵榨惠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)冒冬,這世上最難降的妖魔是什么伸蚯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮简烤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摇幻。我一直安慰自己横侦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布绰姻。 她就那樣靜靜地躺著枉侧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狂芋。 梳的紋絲不亂的頭發(fā)上榨馁,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音帜矾,去河邊找鬼翼虫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛屡萤,可吹牛的內(nèi)容都是我干的珍剑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼死陆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼招拙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起措译,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤别凤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后领虹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體规哪,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年掠械,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了由缆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猾蒂,死狀恐怖均唉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肚菠,我是刑警寧澤舔箭,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響层扶,放射性物質(zhì)發(fā)生泄漏箫章。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一镜会、第九天 我趴在偏房一處隱蔽的房頂上張望檬寂。 院中可真熱鬧,春花似錦戳表、人聲如沸桶至。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)镣屹。三九已至,卻和暖如春价涝,著一層夾襖步出監(jiān)牢的瞬間女蜈,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工色瘩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伪窖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓泞遗,卻偏偏與公主長(zhǎng)得像惰许,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子史辙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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

  • 原創(chuàng)文章&經(jīng)驗(yàn)總結(jié)&從校招到A廠一路陽(yáng)光一路滄桑 詳情請(qǐng)戳www.codercc.com 主要知識(shí)點(diǎn):迭代器汹买、生成...
    你聽(tīng)___閱讀 819評(píng)論 0 1
  • 包(lib)、模塊(module) 在Python中聊倔,存在包和模塊兩個(gè)常見(jiàn)概念晦毙。 模塊:編寫(xiě)Python代碼的py...
    清清子衿木子水心閱讀 3,812評(píng)論 0 27
  • 威尼斯 歐洲的火車都是小火車,車廂不長(zhǎng)耙蔑,慢車居多见妒。外國(guó)人講究個(gè)人隱私,坐在對(duì)面也不會(huì)主動(dòng)跟你說(shuō)話甸陌,可是如果早于你下...
    千年老妖婆閱讀 911評(píng)論 56 39
  • 親愛(ài)的軒軒: 忙碌了一天须揣,上午畫(huà)畫(huà),下午數(shù)學(xué)钱豁,然后又是去花鳥(niǎo)市場(chǎng)耻卡,爸爸滿足了你,幫你又買了只小烏龜牲尺,但媽媽說(shuō)過(guò)你只...
    在寫(xiě)日志的眼袋妹閱讀 177評(píng)論 0 1
  • “需”,需要溃卡,引申為娛樂(lè)溢豆。看卦畫(huà):雨雪霏霏瘸羡,有天網(wǎng)恢恢之象漩仙。 水天需,雨雪霏霏之意犹赖。需讯赏,曾寫(xiě)作襦,通繻冷尉,解為細(xì)密的...
    童年的流星閱讀 635評(píng)論 0 3