基于Python中的yield表達(dá)式介紹
python生成器
python中生成器是迭代器的一種,使用yield返回函數(shù)值。每次調(diào)用yield會暫停,而可以使用next()函數(shù)和send()函數(shù)可以恢復(fù)生成器。
這里可以參考Python函數(shù)式編程指南:對生成器全面講解
注意到y(tǒng)ield是個(gè)表達(dá)式而不僅僅是個(gè)語句,所以可以使用x = yield r 這樣的語法。
這個(gè)知識點(diǎn)在協(xié)程中需要使用。協(xié)程的概念指的是在一個(gè)線程內(nèi),一個(gè)程序中斷去執(zhí)行另一個(gè)程序,有點(diǎn)類似于CPU中斷。這樣減少了切換線程帶來的負(fù)擔(dān),同時(shí)不需要多線程中的鎖機(jī)制,因?yàn)椴淮嬖谕瑫r(shí)寫的問題。
python使用生成器來實(shí)現(xiàn)協(xié)程,下面看一個(gè)python協(xié)程應(yīng)用于生產(chǎn)者消費(fèi)者問題的例子
def consumer():
r = 'yield'
while True:
#當(dāng)下邊語句執(zhí)行時(shí),先執(zhí)行yield r,然后consumer暫停,此時(shí)賦值運(yùn)算還未進(jìn)行
#等到producer調(diào)用send()時(shí),send()的參數(shù)作為yield r表達(dá)式的值賦給等號左邊
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ù)生成器的過程,我們可以再看一個(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)行過程即執(zhí)行x=next(r) 之后,gen()執(zhí)行了yield 1 然后暫停,沒有進(jìn)行對a的賦值。但再調(diào)用y=r.send(10) 時(shí)賦值過程繼續(xù),并把10賦給了a.
以上這篇基于Python中的yield表達(dá)式介紹就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python3中簡單的文件操作及兩個(gè)簡單小實(shí)例分享
文件操作是我們?nèi)粘T谑褂胮ython的時(shí)候經(jīng)常會用到的,下面這篇文章主要給大家介紹了關(guān)于Python3中簡單的文件操作及兩個(gè)簡單小實(shí)例的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06
Python模擬登陸網(wǎng)頁的三種方法小結(jié)
如何使用Python模擬登陸網(wǎng)頁,尤其是在涉及到復(fù)雜的認(rèn)證機(jī)制時(shí)?這篇文章將詳細(xì)介紹Python模擬登陸網(wǎng)頁的三種方法,以及如何繞過一些常見的安全防護(hù)措施,需要的朋友可以參考下2024-01-01
python3利用ctypes傳入一個(gè)字符串類型的列表方法
今天小編就為大家分享一篇python3利用ctypes傳入一個(gè)字符串類型的列表方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
PyTorch中的train()、eval()和no_grad()的使用
本文主要介紹了PyTorch中的train()、eval()和no_grad()的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Python中threading模塊的Lock和RLock區(qū)別詳解
這篇文章主要介紹了Python中threading模塊的Lock和RLock區(qū)別詳解,Lock鎖是Python的原始鎖,在鎖定時(shí)不屬于任何一個(gè)線程,在調(diào)用了 lock.acquire() 方法后,進(jìn)入鎖定狀態(tài),lock.release()方法可以解鎖,底層是通過一個(gè)函數(shù)來實(shí)現(xiàn)的,需要的朋友可以參考下2023-09-09
Django實(shí)現(xiàn)發(fā)送郵件找回密碼功能
在各大網(wǎng)站上,一定都遇到過找回密碼的問題,通常采用的方式是通過發(fā)送帶有驗(yàn)證碼的郵件進(jìn)行身份驗(yàn)證,本文將介紹通過Django實(shí)現(xiàn)郵件找回密碼功能,需要的朋友可以參考下2019-08-08
matplotlib實(shí)現(xiàn)自定義散點(diǎn)形狀marker的3種方法
本文主要介紹了matplotlib實(shí)現(xiàn)自定義散點(diǎn)形狀marker的3種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10

