Python連載41-yield from詳解、委派生成器

1、git

1.yield fromgithub

(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.委派生成器ui

(1)包含yield from表達式的生成器函數spa

(2)委派生成器在yield from表達式暫停,調用方能夠直接把數據發給自生成器.net

(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異常並將返回數組

2、源碼

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.歡迎關注微信公衆號:傅里葉變換,我的公衆號,僅用於學習交流,後臺回覆」禮包「,獲取大數據學習資料

 

相關文章
相關標籤/搜索