Python 3.6 生成器之Send方法
阿新 • • 發佈:2019-02-14
之前一篇生成器講了通過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的左邊和右邊分開看就行了,他們的觸發條件不一樣。 # 好了 這篇就到這裡了