yield send 的一些使用細節
阿新 • • 發佈:2018-03-09
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) can‘t 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 的一些使用細節