yield send 的一些使用細節

2021-09-07 17:13:55 字數 991 閱讀 4375

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

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

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

def

cool():

while

true:

x = yield

print

'瓦哈哈哈哈哈 {}

'.format(x)

x =cool()

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:

yield與send實現協程操作

linux 檔案IO和標準IO的一些實現細節

今日閱讀 unix環境高階程式設計2 才發現一些以前從未注意過的細節。linux程式設計使用的open close read write等檔案io函式屬於系統呼叫的,其實現方式是用了fctrl ioctrl等一些底層操作的函式。而標準io庫中提供的是fopen fclose fread fwrite...

Android gridview 使用的一些小問題

1.gridview 水平滑動,網上有很多的介紹,比如 其中我認為對gridview 的 android layout width的設定是比較關鍵的 我是把它設定為乙個定值 例如1000dp 才能夠正常顯示的,其他情況下顯示不出來。2.對於gridview 某一項 子view 的獲取,使用getch...

NSDictionary的一些使用

1.這裡只有這兩個 如果乙個鍵 值對存在 setobject 這個方法就是 修改 如果乙個鍵 值對不存在 這個方法就是 增加。下面看個例子 判斷鍵值對存在與否是看鍵或者 值有乙個相同就是存在。1 nsstring last lastname 2 nsstring first firstname 3 ...