python yield

首先,如果你還沒(méi)有對(duì)yield有個(gè)初步分認(rèn)識(shí)畅铭,那么你先把yield看做“return”菠隆,這個(gè)是直觀的兵琳,它首先是個(gè)return,普通的return是什么意思骇径,就是在程序中返回某個(gè)值躯肌,返回之后程序就不再往下運(yùn)行了∑葡危看做return之后再把它看做一個(gè)是生成器(generator)的一部分(帶yield的函數(shù)才是真正的迭代器)羡榴,好了,如果你對(duì)這些不明白的話运敢,那先把yield看做return,然后直接看下面的程序校仑,你就會(huì)明白yield的全部意思了:

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))

運(yùn)行結(jié)果:

starting...
4
********************
res: None
4

1.程序開(kāi)始執(zhí)行以后,因?yàn)閒oo函數(shù)中有yield關(guān)鍵字传惠,所以foo函數(shù)并不會(huì)真的執(zhí)行迄沫,而是先得到一個(gè)生成器g(相當(dāng)于一個(gè)對(duì)象)

2.直到調(diào)用next方法,foo函數(shù)正式開(kāi)始執(zhí)行卦方,先執(zhí)行foo函數(shù)中的print方法羊瘩,然后進(jìn)入while循環(huán)

3.程序遇到y(tǒng)ield關(guān)鍵字,然后把yield想想成return,return了一個(gè)4之后盼砍,程序停止尘吗,并沒(méi)有執(zhí)行賦值給res操作,此時(shí)next(g)語(yǔ)句執(zhí)行完成浇坐,所以輸出的前兩行(第一個(gè)是while上面的print的結(jié)果,第二個(gè)是return出的結(jié)果)是執(zhí)行print(next(g))的結(jié)果睬捶,

4.程序執(zhí)行print(""20),輸出20個(gè)*

5.又開(kāi)始執(zhí)行下面的print(next(g)),這個(gè)時(shí)候和上面那個(gè)差不多近刘,不過(guò)不同的是擒贸,這個(gè)時(shí)候是從剛才那個(gè)next程序停止的地方開(kāi)始執(zhí)行的,也就是要執(zhí)行res的賦值操作觉渴,這時(shí)候要注意介劫,這個(gè)時(shí)候賦值操作的右邊是沒(méi)有值的(因?yàn)閯偛拍莻€(gè)是return出去了,并沒(méi)有給賦值操作的左邊傳參數(shù))案淋,所以這個(gè)時(shí)候res賦值是None,所以接著下面的輸出就是res:None,

6.程序會(huì)繼續(xù)在while里執(zhí)行座韵,又一次碰到y(tǒng)ield,這個(gè)時(shí)候同樣return 出4,然后程序停止踢京,print函數(shù)輸出的4就是這次return出的4.

到這里你可能就明白yield和return的關(guān)系和區(qū)別了誉碴,帶yield的函數(shù)是一個(gè)生成器宦棺,而不是一個(gè)函數(shù)了,這個(gè)生成器有一個(gè)函數(shù)就是next函數(shù)翔烁,next就相當(dāng)于“下一步”生成哪個(gè)數(shù),這一次的next開(kāi)始的地方是接著上一次的next停止的地方執(zhí)行的旨涝,所以調(diào)用next的時(shí)候蹬屹,生成器并不會(huì)從foo函數(shù)的開(kāi)始執(zhí)行,只是接著上一步停止的地方開(kāi)始白华,然后遇到y(tǒng)ield后慨默,return出要生成的數(shù),此步就結(jié)束弧腥。

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(g.send(7))

再看一個(gè)這個(gè)生成器的send函數(shù)的例子厦取,這個(gè)例子就把上面那個(gè)例子的最后一行換掉了,輸出結(jié)果:

starting...
4
********************
res: 7
4

先大致說(shuō)一下send函數(shù)的概念:此時(shí)你應(yīng)該注意到上面那個(gè)的紫色的字管搪,還有上面那個(gè)res的值為什么是None虾攻,這個(gè)變成了7,到底為什么更鲁,這是因?yàn)轹浚瑂end是發(fā)送一個(gè)參數(shù)給res的,因?yàn)樯厦嬷v到澡为,return的時(shí)候漂坏,并沒(méi)有把4賦值給res,下次執(zhí)行的時(shí)候只好繼續(xù)執(zhí)行賦值操作媒至,只好賦值為None了顶别,而如果用send的話,開(kāi)始執(zhí)行的時(shí)候拒啰,先接著上一次(return 4之后)執(zhí)行驯绎,先把7賦值給了res,然后執(zhí)行next的作用,遇見(jiàn)下一回的yield谋旦,return出結(jié)果后結(jié)束条篷。

5.程序執(zhí)行g(shù).send(7),程序會(huì)從yield關(guān)鍵字那一行繼續(xù)向下運(yùn)行蛤织,send會(huì)把7這個(gè)值賦值給res變量

6.由于send方法中包含next()方法赴叹,所以程序會(huì)繼續(xù)向下運(yùn)行執(zhí)行print方法,然后再次進(jìn)入while循環(huán)

7.程序執(zhí)行再次遇到y(tǒng)ield關(guān)鍵字指蚜,yield會(huì)返回后面的值后乞巧,程序再次暫停,直到再次調(diào)用next方法或send方法摊鸡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绽媒,一起剝皮案震驚了整個(gè)濱河市蚕冬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌是辕,老刑警劉巖囤热,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異获三,居然都是意外死亡旁蔼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)疙教,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)棺聊,“玉大人,你說(shuō)我怎么就攤上這事贞谓∠夼澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵裸弦,是天一觀的道長(zhǎng)祟同。 經(jīng)常有香客問(wèn)我,道長(zhǎng)理疙,這世上最難降的妖魔是什么耐亏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮沪斟,結(jié)果婚禮上广辰,老公的妹妹穿的比我還像新娘。我一直安慰自己主之,他們只是感情好择吊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著槽奕,像睡著了一般几睛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粤攒,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天所森,我揣著相機(jī)與錄音,去河邊找鬼夯接。 笑死焕济,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盔几。 我是一名探鬼主播晴弃,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了上鞠?” 一聲冷哼從身側(cè)響起际邻,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芍阎,沒(méi)想到半個(gè)月后世曾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谴咸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年轮听,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寿冕。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕊程,死狀恐怖椒袍,靈堂內(nèi)的尸體忽然破棺而出驼唱,到底是詐尸還是另有隱情,我是刑警寧澤驹暑,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布玫恳,位于F島的核電站,受9級(jí)特大地震影響优俘,放射性物質(zhì)發(fā)生泄漏京办。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一帆焕、第九天 我趴在偏房一處隱蔽的房頂上張望惭婿。 院中可真熱鬧,春花似錦叶雹、人聲如沸财饥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钥星。三九已至,卻和暖如春满着,著一層夾襖步出監(jiān)牢的瞬間谦炒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工风喇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宁改,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓魂莫,卻偏偏與公主長(zhǎng)得像透且,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 之前一直對(duì)python的yield理解的有點(diǎn)模糊秽誊,昨天搜索發(fā)現(xiàn)了一個(gè)講解非常清楚的版本鲸沮,所以mark一下。來(lái)源:p...
    俊采星馳_87e0閱讀 1,283評(píng)論 1 1
  • Python yield的用法詳解 如何快速的對(duì)yield有一個(gè)初步的了解,那么首先我們可以先將yield看做是r...
    村東頭老驥閱讀 179評(píng)論 0 0
  • 第一次看到y(tǒng)ield锅论,懵逼讼溺,百度谷歌后,懵圈最易,直到看到了這篇文章 通俗易懂怒坯,部分內(nèi)容其實(shí)有待考究,但好歹讓人知道...
    叨碼閱讀 152評(píng)論 0 0
  • 初始:將yield看作是return重點(diǎn):1)帶有yield的函數(shù)是生成器,不會(huì)像list一樣占用大量?jī)?nèi)存,使用i...
    手捧櫻花v閱讀 246評(píng)論 1 1
  • Python中藻懒,帶有 yield 的函數(shù)在 Python 中被稱之為 generator(生成器)剔猿,何謂 gene...
    TinlokLee閱讀 227評(píng)論 0 0