yield表达式形式的应用
- 基本格式
- 如何給yield傳值
- yield表達式形式的應用
- 栗子一吃貨函數
- 栗子二模擬linux中的命令 grep -rl 查找內容 目錄
基本格式
x = yield 把yield的接收值,賦值給x
def foo():while True:x = yield # 函數執行到yield處,暫停,yield后面沒有任何返回值,默認返回yield Noneprint("x's value is ", x) # next執行,打印出x的值,yield 沒有接收任何傳值,默認接收None,并賦值給x,# 然后繼續執行,返回循環體,又執行到yield處,暫停,返回None g = foo() print(next(g)) print(next(g)) # 運行結果如下: # None # x's value is None # None如何給yield傳值
帶有關鍵字yield的函數的執行結果就是生成器,假設為g, 調用g.send(value)方法,就可以給yield傳值。g.send(None)就是給yield傳None, 相當于沒傳,也就等同于next(g) 的執行效果。
注意,g.send(value) 的傳值方式是基于一個暫停的位置。也就是說生成器函數必須先執行到yield處,暫停在那里,給yield傳值,然后執行next(g)。因此,在使用g.send(value) 給yield傳值前,要進行初始化:next(g) 或者g.send(None)。
我們可以用裝飾器來做生成器的初始化:
yield表達式形式的應用
栗子一:吃貨函數
@init # 用裝飾器來初始化函數 def eater(name):print('{} is ready to eat!'.format(name))food_list = []while True:food = yield food_list # 在暫停處給yield 傳值,yield 得到的值賦值給food(給吃貨上菜)。再次執行到yield 暫停,返回food_listfood_list.append(food)print('{} is eating {}'.format(name, food))e = eater('Seb') # 執行函數,得到一個生成器 print(e.send('meat')) # 給yield傳值并執行函數 print(e.send('fish')) print(e.send('chicken')) # 執行效果如下: # Seb is ready to eat! # Seb is eating meat # ['meat'] # Seb is eating fish # ['meat', 'fish'] # Seb is eating chicken # ['meat', 'fish', 'chicken']上面這個栗子,我們也可以通過一個函數來專門生產yield需要的值,然后從外部傳給yield,實現程序的協同工作:
@init # 用裝飾器來初始化函數 def eater(name):print('{} is ready to eat!'.format(name))food_list = []while True:food = yield food_list # 在暫停處給yield 傳值,yield 得到的值賦值給food(給吃貨上菜)。再次執行到yield 暫停,返回food_listfood_list.append(food)print('{} is eating {}'.format(name, food))def make_food(target, n):for i in range(n):target.send('food_{}'.format(i)) # target代表一個需要被傳值的生成器e = eater('Seb') # 執行函數,得到一個生成器 make_food(e, 3) # 執行效果如下: # Seb is ready to eat! # Seb is eating food_0 # Seb is eating food_1 # Seb is eating food_2栗子二:模擬linux中的命令 grep -rl ‘查找內容’ /目錄
遞歸的查找某目錄下的文件夾及文件,只要是文件內含有”查找內容“的,打印出文件路徑。
分析以上需求,有四個步驟:
1. 遞歸的找出文件路徑,結果給下一步
2. 收到路徑,打開文件獲取文件,把文件對象給下一步
3. 收到文件,打開文件遍歷,取出每一行的內容,給下一步
4. 收到一行內容,判斷有沒有”查找內容“,有的話,把文件名給下一步
5. 收到文件名,打印
下面通過5個函數來實現,函數之間傳遞值用target.send(value) ;接收值用var = yield
總結
以上是生活随笔為你收集整理的yield表达式形式的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 继承、派生、组合
- 下一篇: 实现接口一种可靠的 DLL 接口实现方案