python 生成器協(xié)程運(yùn)算實(shí)例
一、yield運(yùn)行方式
我們定義一個(gè)如下的生成器:
def put_on(name): print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name)) while True: goods = yield print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name)) p = put_on("bigberg") #輸出 G:\python\install\python.exe G:/python/untitled/study4/test/double.py Process finished with exit code 0
當(dāng)我們把一個(gè)函數(shù)通過(guò)yield轉(zhuǎn)換成生成器,直接運(yùn)行函數(shù)是不會(huì)出現(xiàn)結(jié)果返回的。因?yàn)榇藭r(shí)函數(shù)已經(jīng)是個(gè)生成器了,我們要通過(guò)next()來(lái)取得值,并且在遇到y(tǒng)ield時(shí)再次跳出函數(shù)。
print(type(p)) #輸出 <class 'generator'>
我們添加next()方法:
def put_on(name): print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name)) while True: goods = yield #遇到y(tǒng)ield中斷 print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name)) #中斷后運(yùn)行部分 p = put_on("bigberg") p.__next__() #輸出 Hi bigberg, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!
此時(shí)函數(shù)中斷在 goods = yield 的地方,當(dāng)我們?cè)俅握{(diào)用next()函數(shù)時(shí),函數(shù)只會(huì)運(yùn)行中斷以后的內(nèi)容,即上例中的yield下面部分。
我們?cè)偬砑右粋€(gè)next():
def put_on(name): print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name)) while True: goods = yield print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name)) p = put_on("bigberg") p.__next__() p.__next__() #輸出 Hi bigberg, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)! 貨物[None]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。
我們可以第二次next()運(yùn)行的是yield下面的部分內(nèi)容,但是并沒(méi)有給goods傳值,所以貨物是 None。
小結(jié):
通過(guò)yield將函數(shù)轉(zhuǎn)換為生成器,需要使用next()方法才能運(yùn)行
yield只是保留函數(shù)的中斷狀態(tài),再次調(diào)用next()會(huì)執(zhí)行yield后面的部分
yield如果沒(méi)有返回值,會(huì)返回一個(gè)None空值
二、send()傳值
def put_on(name): print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name)) while True: goods = yield print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name)) p = put_on("bigberg") p.__next__() p.send("瓜子") #輸出 Hi bigberg, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)! 貨物[瓜子]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。
小結(jié):
__next__()只是調(diào)用這個(gè)yield,也可以說(shuō)成是喚醒yield,但是不不會(huì)給yield傳值。
send()方法調(diào)用yield是,能給yield傳值
使用send()函數(shù)之前必須使用__next__(),因?yàn)橄纫袛?,?dāng)?shù)诙握{(diào)用時(shí),才可傳值。
def put_on(name): print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name)) while True: goods = yield print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name)) p = put_on("bigberg") p.__next__() p.send("瓜子") p.send("花生") p.send("餅干") p.send("牛奶") #多次調(diào)用send() Hi bigberg, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)! 貨物[瓜子]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。 貨物[花生]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。 貨物[餅干]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。 貨物[牛奶]已經(jīng)被bigberg搬進(jìn)倉(cāng)庫(kù)了。
三、單線程實(shí)現(xiàn)并行效果(協(xié)程)
import time def put_on(name): print("Hi {}, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)!".format(name)) while True: goods = yield print("貨物[%s]已經(jīng)被%s搬進(jìn)倉(cāng)庫(kù)了。"%(goods,name)) def transfer(name): p = put_on('A') p2 = put_on('B') p.__next__() p2.__next__() print("%s將貨物送來(lái)了!"%name) for i in range(5): time.sleep(1) print("%s遞過(guò)來(lái)兩件貨物"%name) p.send("瓜子") p2.send("花生") transfer("bigberg") #輸出 Hi A, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)! Hi B, 貨物來(lái)了,準(zhǔn)備搬到倉(cāng)庫(kù)! bigberg將貨物送來(lái)了! bigberg遞過(guò)來(lái)兩件貨物 貨物[瓜子]已經(jīng)被A搬進(jìn)倉(cāng)庫(kù)了。 貨物[花生]已經(jīng)被B搬進(jìn)倉(cāng)庫(kù)了。 bigberg遞過(guò)來(lái)兩件貨物 貨物[瓜子]已經(jīng)被A搬進(jìn)倉(cāng)庫(kù)了。 貨物[花生]已經(jīng)被B搬進(jìn)倉(cāng)庫(kù)了。 bigberg遞過(guò)來(lái)兩件貨物 貨物[瓜子]已經(jīng)被A搬進(jìn)倉(cāng)庫(kù)了。 貨物[花生]已經(jīng)被B搬進(jìn)倉(cāng)庫(kù)了。 bigberg遞過(guò)來(lái)兩件貨物 貨物[瓜子]已經(jīng)被A搬進(jìn)倉(cāng)庫(kù)了。 貨物[花生]已經(jīng)被B搬進(jìn)倉(cāng)庫(kù)了。 bigberg遞過(guò)來(lái)兩件貨物 貨物[瓜子]已經(jīng)被A搬進(jìn)倉(cāng)庫(kù)了。 貨物[花生]已經(jīng)被B搬進(jìn)倉(cāng)庫(kù)了。
以上這篇python 生成器協(xié)程運(yùn)算實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Pycharm在創(chuàng)建py文件時(shí),自動(dòng)添加文件頭注釋的實(shí)例
今天小編就為大家分享一篇Pycharm在創(chuàng)建py文件時(shí),自動(dòng)添加文件頭注釋的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Python通過(guò)遞歸函數(shù)輸出嵌套列表元素
這篇文章主要介紹了Python通過(guò)遞歸函數(shù)輸出嵌套列表元素,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Python Django教程之實(shí)現(xiàn)待辦事項(xiàng)應(yīng)用程序
Django是一個(gè)基于Python Web框架的高級(jí)Web框架,允許快速開發(fā)和干凈,務(wù)實(shí)的設(shè)計(jì)。本文將創(chuàng)建一個(gè)待辦事項(xiàng)應(yīng)用程序,以了解Django的基礎(chǔ)知識(shí),感興趣的可以嘗試一下2022-10-10PyQt中使用QtSql連接MySql數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了PyQt中使用QtSql連接MySql數(shù)據(jù)庫(kù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07通過(guò)Python收集匯聚MySQL 表信息的實(shí)例詳解
這篇文章主要介紹了通過(guò)Python收集匯聚MySQL 表信息的實(shí)例代碼,核心代碼是創(chuàng)建保存數(shù)據(jù)的腳本,收集的功能腳本,代碼簡(jiǎn)單明了,需要的朋友可以參考下2021-10-10Python高級(jí)應(yīng)用探索之元編程和并發(fā)編程詳解
Python作為一種簡(jiǎn)單易用且功能強(qiáng)大的編程語(yǔ)言,廣泛應(yīng)用于各個(gè)領(lǐng)域,本文主要來(lái)和大家一起探索一下Python中的優(yōu)化技巧、元編程和并發(fā)編程,希望對(duì)大家有所幫助2023-11-11