Python生成器: send函式、close函式與yield關鍵字協作
阿新 • • 發佈:2021-09-28
參考:https://blog.csdn.net/weixin_40247263/article/details/82724878
本文講解Python生成器的send,close函式與yield關鍵字協作
generator的seng()函式和yield關鍵字
以之前對yield關鍵字的瞭解,無非就是yield關鍵字可以給呼叫者返回訊息,同時當函式通過yield關鍵字返回訊息以後函式會暫停在當前位置。
首先複習一下生成器yield關鍵字的使用
test.py
# 定義一個生成器生成從2開始無限翻倍的數字序列 # 2 4 8 16 32 def test(): number = 1 while True: number = number * 2 yield number print('我是yield關鍵字下面一行程式碼') t = test() print(next(t)) # 2 print(next(t)) # 我是yield關鍵字下面一行程式碼 # 4 print(next(t)) # 我是yield關鍵字下面一行程式碼 # 8
解析輸出過程
以此類推,這個生成器是無限的,如果使用for迴圈進行迭代則需要設定退出條件
但其實yield關鍵字的作用是函式與呼叫者的通訊,它不光能夠將值返回給呼叫者,它還可以接收呼叫者傳過來的值,那麼怎麼實現呢?呼叫者通過send()函式將值傳遞給generator,generator通過yield前面的變數來接收,示例如下:
def test(): number = 0 while True: n = yield number print('我是yield關鍵字下面一行程式碼') print('通過send函式傳遞的值是:',n) t = test() print(t.send(None)) # 0 print(t.send(1)) # 我是yield關鍵字下面一行程式碼 # 通過send函式傳遞的值是: 1 # 0
輸出結果分析
即執行send相當於執行了next不一樣的是send可以傳遞引數給生成器,如果傳遞的引數為None則send方法等價於next方法。
generator的close函式
由於下面還涉及到一個 close函式,這裡也演示一下,方便下面理解
t.close() print(next(t))
關閉generator後再呼叫,會出現StopIteration異常,即後面沒值了。