#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的左邊和右邊分開看就行了,他們的觸發條件不一樣。