1. 程式人生 > >Python 3.6 生成器之Send方法

Python 3.6 生成器之Send方法

之前一篇生成器講了通過yield完成生成器的建立,並且通過next方法獲取每一次yield的值。

這一篇講一下yield的另一個方法,send

def func1():  # 生成器函式
    print("ok1")
    x = 10  # 函式內區域性變數x賦值為10
    print(x)
    x = yield 1  # 這裡就是send函式的關鍵
    # 之前我們建立的生成器,yield左邊都是沒有值(我現在不是很確定這裡是不是應該叫做返回值,那就先用值代替)。
    # 現在我們的x會接收到一個值,這個值是什麼,從哪裡來的?我們繼續看下去
    print(x)
    yield x  # 這裡試第二個斷點


f1 = func1()  # 獲取生成器物件
ret1 = next(f1)  # 執行到第一個yield
# ret1 = f1.send(None) #(這一句語句需要全部看完回頭再看)當第一次執行生成器的時候,他並沒有執行到yield這個位置,所以你一點傳值,就會出現問題
# 誰去接收?沒有物件接收就會報錯,所以第一次如果一定要用send去呼叫,那就傳一個None
print(ret1)  # 列印第一個yield返回的值
#########################################
# 關鍵點來了
# 我們現在有兩個問題,x = yield 1,這個x的值是什麼,從哪裡來
# 當下面這條語句執行後,他會將x的值賦值為send方法的引數,並且繼續執行到下一個yield
ret2 = f1.send('eee')
print(ret2)

# ok1
# 10
# 1
# eee
# eee

# 問題都解決了,然後還有一個順序的問題,我先把我測試的結論提出來,大家可以自己打斷點嘗試一下,歡迎拍磚
# f=func1()
# next(f)或者f.send(None) => def func1():
# ......
# x = yield 1 到這裡會返回,x的值不變 => f1.send('eee')
# =>x = yield 1 這時候不要去管右邊,左邊的x被賦值('eee')然後繼續執行
# 其實只要把yield的左邊和右邊分開看就行了,他們的觸發條件不一樣。
# 好了 這篇就到這裡了