python 生成器協(xié)程運算實例
一、yield運行方式
我們定義一個如下的生成器:
def put_on(name):
print("Hi {}, 貨物來了,準備搬到倉庫!".format(name))
while True:
goods = yield
print("貨物[%s]已經(jīng)被%s搬進倉庫了。"%(goods,name))
p = put_on("bigberg")
#輸出
G:\python\install\python.exe G:/python/untitled/study4/test/double.py
Process finished with exit code 0
當我們把一個函數(shù)通過yield轉換成生成器,直接運行函數(shù)是不會出現(xiàn)結果返回的。因為此時函數(shù)已經(jīng)是個生成器了,我們要通過next()來取得值,并且在遇到y(tǒng)ield時再次跳出函數(shù)。
print(type(p)) #輸出 <class 'generator'>
我們添加next()方法:
def put_on(name):
print("Hi {}, 貨物來了,準備搬到倉庫!".format(name))
while True:
goods = yield #遇到y(tǒng)ield中斷
print("貨物[%s]已經(jīng)被%s搬進倉庫了。"%(goods,name)) #中斷后運行部分
p = put_on("bigberg")
p.__next__()
#輸出
Hi bigberg, 貨物來了,準備搬到倉庫!
此時函數(shù)中斷在 goods = yield 的地方,當我們再次調用next()函數(shù)時,函數(shù)只會運行中斷以后的內容,即上例中的yield下面部分。
我們再添加一個next():
def put_on(name):
print("Hi {}, 貨物來了,準備搬到倉庫!".format(name))
while True:
goods = yield
print("貨物[%s]已經(jīng)被%s搬進倉庫了。"%(goods,name))
p = put_on("bigberg")
p.__next__()
p.__next__()
#輸出
Hi bigberg, 貨物來了,準備搬到倉庫!
貨物[None]已經(jīng)被bigberg搬進倉庫了。
我們可以第二次next()運行的是yield下面的部分內容,但是并沒有給goods傳值,所以貨物是 None。
小結:
通過yield將函數(shù)轉換為生成器,需要使用next()方法才能運行
yield只是保留函數(shù)的中斷狀態(tài),再次調用next()會執(zhí)行yield后面的部分
yield如果沒有返回值,會返回一個None空值
二、send()傳值
def put_on(name):
print("Hi {}, 貨物來了,準備搬到倉庫!".format(name))
while True:
goods = yield
print("貨物[%s]已經(jīng)被%s搬進倉庫了。"%(goods,name))
p = put_on("bigberg")
p.__next__()
p.send("瓜子")
#輸出
Hi bigberg, 貨物來了,準備搬到倉庫!
貨物[瓜子]已經(jīng)被bigberg搬進倉庫了。
小結:
__next__()只是調用這個yield,也可以說成是喚醒yield,但是不不會給yield傳值。
send()方法調用yield是,能給yield傳值
使用send()函數(shù)之前必須使用__next__(),因為先要中斷,當?shù)诙握{用時,才可傳值。
def put_on(name):
print("Hi {}, 貨物來了,準備搬到倉庫!".format(name))
while True:
goods = yield
print("貨物[%s]已經(jīng)被%s搬進倉庫了。"%(goods,name))
p = put_on("bigberg")
p.__next__()
p.send("瓜子")
p.send("花生")
p.send("餅干")
p.send("牛奶")
#多次調用send()
Hi bigberg, 貨物來了,準備搬到倉庫!
貨物[瓜子]已經(jīng)被bigberg搬進倉庫了。
貨物[花生]已經(jīng)被bigberg搬進倉庫了。
貨物[餅干]已經(jīng)被bigberg搬進倉庫了。
貨物[牛奶]已經(jīng)被bigberg搬進倉庫了。
三、單線程實現(xiàn)并行效果(協(xié)程)
import time
def put_on(name):
print("Hi {}, 貨物來了,準備搬到倉庫!".format(name))
while True:
goods = yield
print("貨物[%s]已經(jīng)被%s搬進倉庫了。"%(goods,name))
def transfer(name):
p = put_on('A')
p2 = put_on('B')
p.__next__()
p2.__next__()
print("%s將貨物送來了!"%name)
for i in range(5):
time.sleep(1)
print("%s遞過來兩件貨物"%name)
p.send("瓜子")
p2.send("花生")
transfer("bigberg")
#輸出
Hi A, 貨物來了,準備搬到倉庫!
Hi B, 貨物來了,準備搬到倉庫!
bigberg將貨物送來了!
bigberg遞過來兩件貨物
貨物[瓜子]已經(jīng)被A搬進倉庫了。
貨物[花生]已經(jīng)被B搬進倉庫了。
bigberg遞過來兩件貨物
貨物[瓜子]已經(jīng)被A搬進倉庫了。
貨物[花生]已經(jīng)被B搬進倉庫了。
bigberg遞過來兩件貨物
貨物[瓜子]已經(jīng)被A搬進倉庫了。
貨物[花生]已經(jīng)被B搬進倉庫了。
bigberg遞過來兩件貨物
貨物[瓜子]已經(jīng)被A搬進倉庫了。
貨物[花生]已經(jīng)被B搬進倉庫了。
bigberg遞過來兩件貨物
貨物[瓜子]已經(jīng)被A搬進倉庫了。
貨物[花生]已經(jīng)被B搬進倉庫了。
以上這篇python 生成器協(xié)程運算實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
pytorch教程resnet.py的實現(xiàn)文件源碼分析
torchvision.models這個包中包含alexnet、densenet、inception、resnet、squeezenet、vgg等常用的網(wǎng)絡結構,并且提供了預訓練模型,可以通過簡單調用來讀取網(wǎng)絡結構和預訓練模型2021-09-09
在Python中使用mongoengine操作MongoDB教程
這篇文章主要介紹了在Python中使用mongoengine操作MongoDB教程,包括在Django下的一些使用技巧,需要的朋友可以參考下2015-04-04
pandas數(shù)據(jù)探索之合并數(shù)據(jù)示例詳解
這篇文章主要為大家介紹了pandas數(shù)據(jù)探索之合并數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
python項目導入open3d后報錯ImportError:DLL load failed:找不到
這篇文章主要介紹了python項目導入open3d后報錯ImportError:DLL load failed:找不到指定的模塊問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
Python結合Sprak實現(xiàn)計算曲線與X軸上方的面積
這篇文章主要介紹了Python結合Sprak實現(xiàn)計算曲線與X軸上方的面積,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-02-02

