国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python 生成器協程運算實例

2020-01-04 16:51:57
字體:
來源:轉載
供稿:網友

一、yield運行方式

我們定義一個如下的生成器:

def put_on(name): print("Hi {}, 貨物來了,準備搬到倉庫!".format(name)) while True:  goods = yield  print("貨物[%s]已經被%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

當我們把一個函數通過yield轉換成生成器,直接運行函數是不會出現結果返回的。因為此時函數已經是個生成器了,我們要通過next()來取得值,并且在遇到yield時再次跳出函數。

print(type(p)) #輸出<class 'generator'>

我們添加next()方法:

def put_on(name): print("Hi {}, 貨物來了,準備搬到倉庫!".format(name)) while True:  goods = yield  #遇到yield中斷  print("貨物[%s]已經被%s搬進倉庫了。"%(goods,name)) #中斷后運行部分 p = put_on("bigberg")p.__next__() #輸出Hi bigberg, 貨物來了,準備搬到倉庫!

此時函數中斷在 goods = yield 的地方,當我們再次調用next()函數時,函數只會運行中斷以后的內容,即上例中的yield下面部分。

我們再添加一個next():

def put_on(name): print("Hi {}, 貨物來了,準備搬到倉庫!".format(name)) while True:  goods = yield  print("貨物[%s]已經被%s搬進倉庫了。"%(goods,name)) p = put_on("bigberg")p.__next__()p.__next__() #輸出Hi bigberg, 貨物來了,準備搬到倉庫!貨物[None]已經被bigberg搬進倉庫了。

我們可以第二次next()運行的是yield下面的部分內容,但是并沒有給goods傳值,所以貨物是 None。

小結:

通過yield將函數轉換為生成器,需要使用next()方法才能運行

yield只是保留函數的中斷狀態,再次調用next()會執行yield后面的部分

yield如果沒有返回值,會返回一個None空值

二、send()傳值

def put_on(name): print("Hi {}, 貨物來了,準備搬到倉庫!".format(name)) while True:  goods = yield  print("貨物[%s]已經被%s搬進倉庫了。"%(goods,name)) p = put_on("bigberg")p.__next__()p.send("瓜子") #輸出Hi bigberg, 貨物來了,準備搬到倉庫!貨物[瓜子]已經被bigberg搬進倉庫了。

小結:

__next__()只是調用這個yield,也可以說成是喚醒yield,但是不不會給yield傳值。

send()方法調用yield是,能給yield傳值

使用send()函數之前必須使用__next__(),因為先要中斷,當第二次調用時,才可傳值。

def put_on(name): print("Hi {}, 貨物來了,準備搬到倉庫!".format(name)) while True:  goods = yield  print("貨物[%s]已經被%s搬進倉庫了。"%(goods,name)) p = put_on("bigberg")p.__next__()p.send("瓜子")p.send("花生")p.send("餅干")p.send("牛奶") #多次調用send()Hi bigberg, 貨物來了,準備搬到倉庫!貨物[瓜子]已經被bigberg搬進倉庫了。貨物[花生]已經被bigberg搬進倉庫了。貨物[餅干]已經被bigberg搬進倉庫了。貨物[牛奶]已經被bigberg搬進倉庫了。

三、單線程實現并行效果(協程)

import time  def put_on(name): print("Hi {}, 貨物來了,準備搬到倉庫!".format(name)) while True:  goods = yield  print("貨物[%s]已經被%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遞過來兩件貨物貨物[瓜子]已經被A搬進倉庫了。貨物[花生]已經被B搬進倉庫了。bigberg遞過來兩件貨物貨物[瓜子]已經被A搬進倉庫了。貨物[花生]已經被B搬進倉庫了。bigberg遞過來兩件貨物貨物[瓜子]已經被A搬進倉庫了。貨物[花生]已經被B搬進倉庫了。bigberg遞過來兩件貨物貨物[瓜子]已經被A搬進倉庫了。貨物[花生]已經被B搬進倉庫了。bigberg遞過來兩件貨物貨物[瓜子]已經被A搬進倉庫了。貨物[花生]已經被B搬進倉庫了。

以上這篇python 生成器協程運算實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博湖县| 治多县| 田林县| 洛阳市| 余庆县| 黑龙江省| 五原县| 沅江市| 南丹县| 榆林市| 新巴尔虎右旗| 兴文县| 驻马店市| 新邵县| 岳池县| 门头沟区| 荃湾区| 抚州市| 嘉义市| 涡阳县| 乌苏市| 巩义市| 桃园市| 明溪县| 西贡区| 南昌市| 枝江市| 丹寨县| 威信县| 肥乡县| 普兰店市| 额敏县| 布拖县| 兴宁市| 株洲市| 昭苏县| 紫阳县| 和平县| 三明市| 佛山市| 潜江市|