基于Python中的yield表達(dá)式介紹
python生成器
python中生成器是迭代器的一種,使用yield返回函數(shù)值。每次調(diào)用yield會(huì)暫停,而可以使用next()函數(shù)和send()函數(shù)可以恢復(fù)生成器。
這里可以參考Python函數(shù)式編程指南:對(duì)生成器全面講解
注意到y(tǒng)ield是個(gè)表達(dá)式而不僅僅是個(gè)語(yǔ)句,所以可以使用x = yield r 這樣的語(yǔ)法。
這個(gè)知識(shí)點(diǎn)在協(xié)程中需要使用。協(xié)程的概念指的是在一個(gè)線程內(nèi),一個(gè)程序中斷去執(zhí)行另一個(gè)程序,有點(diǎn)類似于CPU中斷。這樣減少了切換線程帶來(lái)的負(fù)擔(dān),同時(shí)不需要多線程中的鎖機(jī)制,因?yàn)椴淮嬖谕瑫r(shí)寫(xiě)的問(wèn)題。
python使用生成器來(lái)實(shí)現(xiàn)協(xié)程,下面看一個(gè)python協(xié)程應(yīng)用于生產(chǎn)者消費(fèi)者問(wèn)題的例子
def consumer(): r = 'yield' while True: #當(dāng)下邊語(yǔ)句執(zhí)行時(shí),先執(zhí)行yield r,然后consumer暫停,此時(shí)賦值運(yùn)算還未進(jìn)行 #等到producer調(diào)用send()時(shí),send()的參數(shù)作為yield r表達(dá)式的值賦給等號(hào)左邊 n = yield r #yield表達(dá)式可以接收send()發(fā)出的參數(shù) 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) #調(diào)用consumer生成器 print('[PRODUCER] Consumer return: %s' % r) c.close() c = consumer() produce(c)
注意到send需要先調(diào)用send(None),因?yàn)橹挥猩善魇菚和顟B(tài)才可以接收send的參數(shù)。
為了理解send()恢復(fù)生成器的過(guò)程,我們可以再看一個(gè)例子:
def gen(): a = yield 1 print('yield a % s' % a) b = yield 2 print('yield b % s' % b) c = yield 3 print('yield c % s' % c) r = gen() x = next(r) print('next x %s' % x) y = r.send(10) print('next y %s' %y) z = next(r) print('next z %s' % z)
可以看到實(shí)際上y=r.send(10) 的參數(shù)10是賦給了a。整個(gè)運(yùn)行過(guò)程即執(zhí)行x=next(r) 之后,gen()執(zhí)行了yield 1 然后暫停,沒(méi)有進(jìn)行對(duì)a的賦值。但再調(diào)用y=r.send(10) 時(shí)賦值過(guò)程繼續(xù),并把10賦給了a.
以上這篇基于Python中的yield表達(dá)式介紹就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Matplotlib實(shí)現(xiàn)subplot和subplots簡(jiǎn)單對(duì)比
在畫(huà)布創(chuàng)建子圖會(huì)有很多方法,本文主要介紹了Matplotlib實(shí)現(xiàn)subplot和subplots簡(jiǎn)單對(duì)比,簡(jiǎn)單的介紹了這兩種方法區(qū)別,感興趣的可以了解一下2021-05-05Django數(shù)據(jù)庫(kù)操作之save與update的使用
這篇文章主要介紹了Django數(shù)據(jù)庫(kù)操作之save與update的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python chardet庫(kù)識(shí)別編碼原理解析
這篇文章主要介紹了python chardet庫(kù)識(shí)別編碼原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02基于OpenCV目標(biāo)跟蹤實(shí)現(xiàn)人員計(jì)數(shù)器
這篇文章主要介紹了如何利用Python OpenCV這兩者來(lái)創(chuàng)建更準(zhǔn)確的人員計(jì)數(shù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴快來(lái)跟隨小編學(xué)習(xí)一下吧2022-03-03python調(diào)用百度REST API實(shí)現(xiàn)語(yǔ)音識(shí)別
這篇文章主要為大家詳細(xì)介紹了python調(diào)用百度REST API實(shí)現(xiàn)語(yǔ)音識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08Python利用pywin32庫(kù)實(shí)現(xiàn)將PPT導(dǎo)出為高清圖片
這篇文章主要為大家詳細(xì)介紹了Python如何利用pywin32庫(kù)實(shí)現(xiàn)將PPT導(dǎo)出為高清圖片的功能,文中的示例代講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01Python logging日志庫(kù)空間不足問(wèn)題解決
這篇文章主要介紹了Python logging日志庫(kù)空間不足問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09python檢測(cè)文件夾變化,并拷貝有更新的文件到對(duì)應(yīng)目錄的方法
今天小編就為大家分享一篇python檢測(cè)文件夾變化,并拷貝有更新的文件到對(duì)應(yīng)目錄的方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10PyTorch計(jì)算損失函數(shù)對(duì)模型參數(shù)的Hessian矩陣示例
這篇文章主要為大家介紹了PyTorch計(jì)算損失函數(shù)對(duì)模型參數(shù)的Hessian矩陣的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05