前提條件: 如果函數(shù)含有yield就是生成器,執(zhí)行過程中遇到y(tǒng)ield就跳出。
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)同仁免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。舉例:
def gen():
for i in range(10):
x = yield i
print(x)
g=ge()
print(g.send(None)))
print(g.send(2))
先說表達(dá)式x = yield i
如果這個(gè)表達(dá)式只是x = i, 相信每個(gè)人都能理解。即把i的值賦值給了x,而現(xiàn)在等號(hào)右邊是一個(gè)yield i,所以先要執(zhí)行yield i,然后才是賦值。
因?yàn)樯善饔龅統(tǒng)ield就跳出,所以yield把i值返回到了調(diào)用者那里。
這個(gè)表達(dá)式的下一步操作:賦值。卻因?yàn)榈忍?hào)右邊的yield被暫停了,換句話說x = yield i才執(zhí)行了一半,當(dāng)調(diào)用者通過send(var)回到生成器函數(shù)時(shí)是回到之前那個(gè)賦值表達(dá)式被暫停的那里,所以接下來執(zhí)行x = yield i的另一半,那就是這個(gè)賦值操作啦,這個(gè)值正是調(diào)用者通過send(var)發(fā)送進(jìn)生成器的值。
再舉例:
def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK'
def produce(c):
c.send(None)
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()
c = consumer()
produce(c)
執(zhí)行結(jié)果:
[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK
官方說明:
注意到consumer函數(shù)是一個(gè)generator,把一個(gè)consumer傳入produce后:
首先調(diào)用c.send(None)啟動(dòng)生成器;然后,一旦生產(chǎn)了東西,通過c.send(n)切換到consumer執(zhí)行;consumer通過yield拿到消息,處理,又通過yield把結(jié)果傳回;produce拿到consumer處理的結(jié)果,繼續(xù)生產(chǎn)下一條消息;produce決定不生產(chǎn)了,通過c.close()關(guān)閉consumer,整個(gè)過程結(jié)束。
我的理解:
請(qǐng)注意produce()函數(shù)的最開始的地方是c.send(None),正如上面所說這個(gè)操作是初始化generator,并做第一個(gè)yield(遇到consumer函數(shù)就返回),它是有值的,他的值r為'',如果你執(zhí)行命令行的話,你會(huì)發(fā)現(xiàn)結(jié)果先空了一行,就是他的功勞。 然后到n=0+1=1,此時(shí)執(zhí)行c.send(1) ,它開始的位置是在給consumer函數(shù)中的n賦值,即[CONSUMER] Consuming 1 ,繼續(xù)執(zhí)行命令,此時(shí)r被賦值為‘200 ok’ ,因?yàn)閣hile True 會(huì)一直循環(huán),所以繼續(xù)重來,但是生成器遇到y(tǒng)ield 會(huì)自動(dòng)跳出,此時(shí)跳出結(jié)果變成為r=‘200 ok’。
補(bǔ)充知識(shí):
while True :
只有遇到continue 和break才能跳出循環(huán)。在生成器里面遇到y(tǒng)ield也能。
if not x:相當(dāng)于if x is not None和
if not x is None`
在python中 None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元組()都相當(dāng)于False
參考地址如下:
python
廖雪峰
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁標(biāo)題:Python生成器generator-創(chuàng)新互聯(lián)
分享URL:http://jinyejixie.com/article42/dijjec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、關(guān)鍵詞優(yōu)化、全網(wǎng)營銷推廣、靜態(tài)網(wǎng)站、網(wǎng)站建設(shè)、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容