1. 程式人生 > >yield send 的一些使用細節

yield send 的一些使用細節

style 繼續 blog 輸出 但是 enc 單例 http 每次

其實日常中我們使用最多的是 return 很少會使用到 yield 去創造一個生成器。一般就是算算算 算完之後用 return 返回一把。

但是有些情況下 比如需要節約內存不需要一把全部返回,每次使用的時候再去算,我們就會用到生成器。

可以從一個最簡單例子來看看:

def cool():
    while True:
        x = yield
        print 瓦哈哈哈哈哈 {}.format(x)    

x = cool()
<generator object cool at 0x10eee4f00>

x.next()

x.next()
瓦哈哈哈哈哈 None

可以註意到,我在第一次調用 x.next() 的時候什麽輸出都沒有。其實這裏的行為是 yield 接收到一個 None 值。不管我們是使用 send 還是使用 next 方法都會觸發繼續向下執行。而且在遇到 yield 的時候會停下來。

send 方法更有趣一點,send 方法類似於實現了兩個功能,一個是 send 一個值給 yield 同時執行 next。來看一下:

x.send(234)
cant send non-None value to a just-started generator

什麽情況,不是說好的 send 可以當 next 用嗎?

HHH 其實還有個設定,如果未初始化 生成器的話,第一次必須使用 send(None) 初始化一把。 所以讓我們再來試試:

x = cool()
x.send(None)
x.send(123)
瓦哈哈哈哈哈 123

可以看到還是調用 send 第一次我發 None 初始化這個 generator。然後 send(123) 就可以正常運行了。註意這裏發送的 123 是發送給 yield 的。而不是給 x 的。

Reference:

https://www.cnblogs.com/vipchenwei/p/7049404.html yield與send實現協程操作

yield send 的一些使用細節