重點理解以下幾點:
1. 在生成帶有yield的 (下面的函數h()) generator後 第一個迭代必須是__next__()。
2. __next__() 和 send(None)的效果是相同的
3. 帶有yield 的生成器中,yield有兩個作用—存儲和給next和send觸發yield之間的代碼動作(具體看代碼吧);next和 send的作用其實就是一個動作指令,這個指令的具體工作內容就是從當前的yield執行到下一個yield,當找不到下一個yield時候就出發StopIteration。(以m = yield 5 .... n = yield 100爲例,send 和 next操作就是觸發中間省略號...部分的代碼內容,而執行value2 = c.send('aaa')時,value2的值是下個yield即yield 100存儲的這個‘100’,而send('aaa')這個操作呢把'aaa'賦給了 m = yield 5 中的m。說的有點亂,上個圖吧。)
def h():
print('start')
m = yield 5
print(m)
n = yield 100
print(m)
print(n)
m = yield 200
print(m)
print(n)
c = h()
value1 = c.__next__() # c.__next__() 相當於 c.send(None)
print("這是表達式 yield 5 對應存儲的值:" + str(value1) + "\n")
value2 = c.send('aaa')
print("這是表達式 yield 100 對應存儲的值:" + str(value2) + "\n")
value3 = c.send(999999)
print("這是表達式 yield 200 對應存儲的值:" + str(value3) + "\n")
c.send('最後一個yield值修改但是找不到結束的"yield標籤')
運行結果