關於python3 中yield的筆記(__next__ 以及 send)

重點理解以下幾點:

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標籤')

運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章