1. 程式人生 > 其它 >Python生成器: send函式、close函式與yield關鍵字協作

Python生成器: send函式、close函式與yield關鍵字協作

  參考: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異常,即後面沒值了。