之前只是介紹生成器,那有些同學就說了,這個生成器除了能節省資源,提高工作效率,但是我們再哪些場景下可以用呢?在哪些地方可以體現出它的價值呢?下面我們來逐一解答這些疑問。
def consumer(name):print("%s準備發工資啦!"%name)
while true:
gongzi=yield
print("工資%s來了,被%s領了!"%(gongzi,name))
x=consumer("huwei")
x.__next__()
#輸出huwei準備發工資啦!
我們再加幾個__next__()方法:
def consumer(name):print("%s準備發工資啦!"%name)
while true:
gongzi=yield
print("工資%s來了,被%s領了!"%(gongzi,name))
x=consumer("huwei")
x.__next__()
x.__next__()
b="1個億"
x.send(b)
x.__next__()
#輸出huwei準備發工資啦!
工資none來了,被huwei領了!
工資1個億來了,被huwei領了!
工資none來了,被huwei領了!
# next()只是在呼叫(喚醒)yield,但是不會給其傳值,而send除了能夠呼叫(喚醒)同時還能給其傳值
第乙個例子沒有執行print("工資%s來了,被%s領了!"%(gongzi,name)),接著我們來除錯一下,看看具體過程:
...........................debug
我們把"優化"發工資的再規範一下,可以使用
#-*-coding:utf-8-*-importtime
def consumer(name): #0
print("%s準備發工資啦!"%name) #4
whiletrue:
gongzi=yield #5
print("工資%s來了,被%s領了!"%(gongzi,name)) #9
defproducer(name):
x=consumer("a") #1 只是將consumer()變成乙個生成器
x1=consumer("b") #2 只是將consumer()變成乙個生成器
x.__next__() #3
x1.__next__() #6
print("財務開始做工資啦!") #7
for i in range(10):
time.sleep(2)
print("做了2個人的工資!")
x.send(i) #8
x1.send(i) #10
producer("dick")
#輸出a準備發工資啦!
b準備發工資啦!
財務開始做工資啦!
做了2個人的工資!
工資0來了,被a領了!
工資0來了,被b領了!
做了2個人的工資!
工資1來了,被a領了!
工資1來了,被b領了!
做了2個人的工資!
工資2來了,被a領了!
工資2來了,被b領了!
解析:在#1和#2只是將consumer()函式變成生成器(如果# 0 consumer是函式的話,我們執行consumer()就會直接列印),在這裡#0是生成器,而我們第一次呼叫#3目的是要其列印#4,我們執行#3時,程式consumer才會繼續往下執行,執行到#5處 自動中斷返回,返回到#6,再從#6呼叫程式consumer會繼續往下執行,執行到#5處 自動中斷返回到#7繼續向下執行,當執行到#8時將#8 i 的值賦值給yield,繼續向下#9執行,執行後由於是while迴圈,又繼續回到#5跳出返回到#10,接著#10又send i 賦值給#5,如此執行,直到結束
注意:實現單執行緒下的並行處理,雖然它仍然是序列依次處理,但是我們可以在不同的角色之間來回地切換,並且執行速度特別快,感覺上是並行的。注意,這個就是非同步i/o的雛形。
小白的Python之路 day4 生成器並行運算
我們已經明白生成器內部的結構,其實就是通過像函式這樣的東西實現的!多執行緒和單執行緒 簡單來說多執行緒就是並行運算,單執行緒就是序列運算 第一步 生成乙個生成器 第二步 執行第乙個next方法,開始呼叫函式,執行到yield時中斷,把返回值返回給變數 moon cake 下面有next有幾次執行幾次...
day19 生成器函式
語法上和函式類似 生成器函式和常規函式幾乎是一樣的。它們都是使用def語句進行定義,差別在於,生成器使用yield語句返回乙個值,而常規函式使用return語句返回乙個值。自動實現迭代器協議 對於生成器,python會自動實現迭代器協議,以便應用到迭代背景中,如for迴圈,sum函式 由於生成器自動...
day19 生成器函式
語法上和函式類似 生成器函式和常規函式幾乎是一樣的。它們都是使用def語句進行定義,差別在於,生成器使用yield語句返回乙個值,而常規函式使用return語句返回乙個值。自動實現迭代器協議 對於生成器,python會自動實現迭代器協議,以便應用到迭代背景中,如for迴圈,sum函式 由於生成器自動...