一、 1.yield from (1)調用協程為了得到返回值,協程必須正常終止 (2)生成器正常終止會發出StopIteration異常,異常對象的value屬性保存返回值。 (3)yield from從內部捕獲StopIteration異常 我們舉個例子 解釋:我們從中可以看出,兩個函數最後返回的 ...
一、
1.yield from
(1)調用協程為了得到返回值,協程必須正常終止
(2)生成器正常終止會發出StopIteration異常,異常對象的value屬性保存返回值。
(3)yield from從內部捕獲StopIteration異常
我們舉個例子
def gen(): for c in "AB": yield c #list直接用生成器作為參數 print(list(gen())) def gen_new(): yield from "AB" print(list(gen_new())
解釋:我們從中可以看出,兩個函數最後返回的結果是一致的,可以用下麵的圖片來解釋它們的運行過程,第二個函數增加了一個管道層,使得這個函數更加靈活;第一個函數中,list向迭代器逐一要值,然後一起輸出出來;第二個函數,向管道要值,然後管道收集到所有的迭代數,然後再一併返回給list函數
2.委派生成器
(1)包含yield from表達式的生成器函數
(2)委派生成器在yield from表達式暫停,調用方可以直接把數據發給自生成器
(3)子生成器再把產出的值發給調用方
(4)子生成器在最後,解釋器會拋出StopIteration,並且把返回值附加到異常對象上
舉個例子:
from collections import namedtuple ResClass = namedtuple("Res","count average") #子生成器 def average(): total = 0.0 count = 0 average = None while True: term = yield #None是哨兵值 if term is None: break total += term count += 1 average = total/count return ResClass(count,average) #委派生成器 def grouper(storages,key): while True: #獲取averager()返回的值 storages[key] = yield from average() #客戶端代碼 def abc(): process_data = { "boys_2":[39.0,40.8,43.2,43.1,38.6,41.4,40.6,36.3], "boys_1":[1.38,1.5,1.32,1.25,1.37,1.48,1.25,1.49,1.46] } storages = {} for k,v in process_data.items(): #獲取協程 coroutine = grouper(storages,k) #預激協程 next(coroutine) #發送數據到協程 for dt in v: coroutine.send(dt) #終止協程 coroutine.send(None) print(storages) #run if __name__ == "__main__": abc()
#解釋:
#1.外層for迴圈每次迭代會新建一個grouper實例,賦值給coroutine變數;grouper是委派生成器生成
#2.調用next(coroutine),預激委派生成器grouper,此時進入while True迴圈,調用子生成器average
#3.內層for迴圈調用coroutine.send(value),直接把值傳給子生成器average,同時,當前的grouper
#4.內層迴圈結束後,grouper實例依舊在yield from表達式處暫停,因此,grouper函數定義體中
#5.coroutine.send(None)終止averager子生成器,子生成器拋出StopIteration異常並將返回數組
二、源碼
d27_4_yield_from_and_delegate_generator.py
https://github.com/ruigege66/Python_learning/blob/master/d27_4_yield_from_and_delegate_generator.py
2.CSDN:https://blog.csdn.net/weixin_44630050(心悅君兮君不知-睿)
3.博客園:https://www.cnblogs.com/ruigege0000/
4.歡迎關註微信公眾號:傅里葉變換,個人公眾號,僅用於學習交流,後臺回覆”禮包“,獲取大數據學習資料