成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python生成器next方法和send方法區(qū)別

yimo / 2043人閱讀

摘要:原文和傳送門如下官網(wǎng)傳送門翻譯版本恢復(fù)執(zhí)行并將值發(fā)送到生成器函數(shù)中。所述值參數(shù)成為當(dāng)前產(chǎn)量表達(dá)的結(jié)果。該方法返回由生成器產(chǎn)生的下一個(gè)值,或者如果生成器退出而不產(chǎn)生另一個(gè)值則引發(fā)。更新對(duì)生成器使用方法,解釋器在底層會(huì)調(diào)用方法,也就是方法

生成器簡(jiǎn)介

python中,含有yield關(guān)鍵字的對(duì)象就是一個(gè)生成器,每次調(diào)用next方法時(shí)會(huì)執(zhí)行到yield后面的語(yǔ)句,然后返回yield后面代碼塊的執(zhí)行結(jié)果。其實(shí)也可以調(diào)用send方法
下面給個(gè)例子方便理解。

next方法
def foo():
    bar_a = yield 1         # bar_a是語(yǔ)句塊(yield 1)的返回值,默認(rèn)為None
    bar_b = yield bar_a
    yield "最后一個(gè)值,再迭代就要報(bào)StopIteration了"

f = foo()                   # 創(chuàng)建生成器,此時(shí)沒(méi)有執(zhí)行foo()里的任何語(yǔ)句
print(next(f))              # 從foo()里進(jìn)入,一直執(zhí)行到(yield 1)處,此時(shí)變量bar_a還沒(méi)有創(chuàng)建
print(next(f))              # 先將語(yǔ)句塊(yield 1)的返回值賦值個(gè)bar_a,此時(shí)bar_a的值是None。
                            # 然后執(zhí)行到語(yǔ)句塊(yield bar_a),bar_b也還沒(méi)有被創(chuàng)建
print(next(f)

輸出:

>>>1
>>>None
>>>最后一個(gè)值,再迭代就要報(bào)StopIteration了

可以看出,f = foo()創(chuàng)建生成器時(shí),每次執(zhí)行到yield時(shí),會(huì)跳出去并將yield關(guān)鍵字后面的內(nèi)容返回給調(diào)用者。下一次有別的調(diào)用者再次調(diào)用生成器時(shí),會(huì)先恢復(fù)生成器上次的機(jī)器狀態(tài),再接著執(zhí)行指導(dǎo)遇到yield或者元素迭代完畢。
而且我們可以看到bar_abar_b是語(yǔ)句yield 1yield bar_a的返回值,注意:不是生成器的返回值。
這里有個(gè)比較繞的地方,我們用bar_a = yield 1做分析:

1是生成器的返回值。因?yàn)樯善鞣祷?b>yield后面的代碼塊

bar_a是語(yǔ)句yield 1的返回值,這就好比我們寫

a = print("my lover")
print("a的值是:", a)

會(huì)輸出:

>>>my lover
>>>a的值是: None

send方法
def foo():
    bar_a = yield 1
    bar_b = yield bar_a
    yield "最后一個(gè)值,再迭代就要報(bào)StopIteration了"

f = foo()
print(f.send(None))
print(f.send("my lover"))
print(next(f))

輸出:

>>>1
>>>my lover
>>>最后一個(gè)值,再迭代就要報(bào)StopIteration了

這里f.send(None)是初始化生成器,和next(f)的效果一模一樣。但是不推薦這么寫,因?yàn)椴灰?guī)范。
注意輸出的第二行是字符串my lover,而不是None。這是因?yàn)?b>send函數(shù)帶有一個(gè)參數(shù),這個(gè)參數(shù)會(huì)覆蓋yield 1語(yǔ)句的返回值,也就是bar_a的值現(xiàn)在不是None了。

FAQ

官網(wǎng)提到,當(dāng)我們創(chuàng)建一個(gè)生成器時(shí),第一次調(diào)用只能用next()或者send(None)。因?yàn)榇藭r(shí)send傳入其他參數(shù)也沒(méi)有yield語(yǔ)句去接收。
這句話我看不懂,說(shuō)的好像傳入None就有yield來(lái)接收似的。各位如果明白的歡迎指點(diǎn)。
原文和傳送門如下:

官網(wǎng)傳送門

Resumes the execution and “sends” a value into the generator function. The value argument becomes the result of the current yield expression. The send() method returns the next value yielded by the generator, or raises StopIteration if the generator exits without yielding another value. When send() is called to start the generator, it must be called with None as the argument, because there is no yield expression that could receive the value.
Google翻譯版本:
恢復(fù)執(zhí)行并將值“發(fā)送”到生成器函數(shù)中。所述 值參數(shù)成為當(dāng)前產(chǎn)量表達(dá)的結(jié)果。該 send()方法返回由生成器產(chǎn)生的下一個(gè)值,或者StopIteration如果生成器退出而不產(chǎn)生另一個(gè)值則引發(fā)。當(dāng)send()調(diào)用啟動(dòng)生成器時(shí),必須將其None作為參數(shù)調(diào)用,因?yàn)闆](méi)有可以接收該值的yield表達(dá)式。

更新:
2018-11-24
對(duì)生成器使用send(None)方法,解釋器在底層會(huì)調(diào)用__next__方法,也就是next()方法

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44930.html

相關(guān)文章

  • python中yield的用法詳解——最簡(jiǎn)單,最清晰的解釋

    摘要:程序執(zhí)行,程序會(huì)從關(guān)鍵字那一行繼續(xù)向下運(yùn)行,會(huì)把這個(gè)值賦值給變量由于方法中包含方法,所以程序會(huì)繼續(xù)向下運(yùn)行執(zhí)行方法,然后再次進(jìn)入循環(huán)程序執(zhí)行再次遇到關(guān)鍵字,會(huì)返回后面的值后,程序再次暫停,直到再次調(diào)用方法或方法。 此文轉(zhuǎn)載,侵刪,原文地址:https://blog.csdn.net/mieleiz... 首先,如果你還沒(méi)有對(duì)yield有個(gè)初步分認(rèn)識(shí),那么你先把yield看做return...

    VPointer 評(píng)論0 收藏0
  • Python 面試」第二次更新

    摘要:結(jié)果為對(duì)于迭代器和生成器你知道哪些,它們分別應(yīng)用于什么場(chǎng)景先介紹什么是可迭代的任何可用于循環(huán)的都是可迭代的。示例結(jié)果為,迭代器任何可以使用函數(shù)的都是迭代器,也可使用函數(shù)將可迭代對(duì)象變?yōu)榈?。未寫完,下次更新補(bǔ)上。 showImg(https://segmentfault.com/img/bVbuN3P); 閱讀本文大約需要 8 分鐘。 7.說(shuō)一下 Python 中的裝飾器 原理:利用...

    Yu_Huang 評(píng)論0 收藏0
  • python yield

    摘要:第二次迭代時(shí),使用,那么,就是強(qiáng)行修改表達(dá)式的值為,本來(lái)是的,那么與都有返回值,它們的返回值是當(dāng)前迭代遇到時(shí),后面表達(dá)式的值,其實(shí)就是當(dāng)前迭代中后面的參數(shù)。 yield 為了精通 yield ,你必須要理解:當(dāng)你調(diào)用這個(gè)函數(shù)的時(shí)候,函數(shù)內(nèi)部的代碼并不立馬執(zhí)行 ,這個(gè)函數(shù)只是返回一個(gè)生成器對(duì)象,這有點(diǎn)蹊蹺不是嗎。 那么,函數(shù)內(nèi)的代碼什么時(shí)候執(zhí)行呢?當(dāng)你使用for進(jìn)行迭代的時(shí)候.現(xiàn)在到了關(guān)...

    20171112 評(píng)論0 收藏0
  • python協(xié)程1:yield 10分鐘入門

    摘要:協(xié)程定義協(xié)程的底層架構(gòu)是在中定義,并在實(shí)現(xiàn)的。為了簡(jiǎn)化,我們會(huì)使用裝飾器預(yù)激協(xié)程。執(zhí)行上述代碼結(jié)果如下出錯(cuò)的原因是發(fā)送給協(xié)程的值不能加到變量上。示例使用和方法控制協(xié)程。 最近找到一本python好書《流暢的python》,是到現(xiàn)在為止看到的對(duì)python高級(jí)特性講述最詳細(xì)的一本??戳藚f(xié)程一章,做個(gè)讀書筆記,加深印象。 協(xié)程定義 協(xié)程的底層架構(gòu)是在pep342 中定義,并在python2...

    MartinDai 評(píng)論0 收藏0
  • SICP Python 描述 第五章 序列協(xié)程

    摘要:消息向迭代器獲取所表示的底層序列的下一個(gè)元素。為了對(duì)方法調(diào)用做出回應(yīng),迭代器可以執(zhí)行任何計(jì)算來(lái)獲取或計(jì)算底層數(shù)據(jù)序列的下一個(gè)元素。這個(gè)迭代器應(yīng)擁有方法,依次返回序列中的每個(gè)元素,最后到達(dá)序列末尾時(shí)產(chǎn)生異常。 第五章 序列和協(xié)程 來(lái)源:Chapter 5: Sequences and Coroutines 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 5.1 引言 在這一章中,我...

    leap_frog 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<