Python--函數語言程式設計
阿新 • • 發佈:2018-11-28
運用yield實現
模擬 grep -rl 'root' /etc (遞迴找etc下所有檔案並開啟,過濾有'root'的檔案)
# import os # g = os.walk(r'C:\Users\56360\Desktop\city\mycity') # print(next(g)) # 拿到當前資料夾下的子目錄和子檔案 格式:('C:\Users\56360\Desktop\city\mycity',['src', 'static', 'test'],['index.html', 'package-lock.json', 'package.json']) # print(next(g)) # 會進入src目錄,依次類推,知道有子檔案時,進行拼接就拿到絕對路勁 import os def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper #階段一:遞迴地找檔案的絕對路徑,把路徑發給階段二 @init def search(target): 'search file abspath' while True: start_path=yield g = os.walk(start_path) for par_dir, _, files in g: # print(par_dir,files) for file in files: file_path = r'%s\%s' % (par_dir, file) target.send(file_path) #階段二:收到檔案路徑,開啟檔案獲取獲取物件,把檔案物件發給階段三 @init def opener(target): 'get file obj: f=open(filepath)' while True: file_path=yield with open(file_path,encoding='utf-8') as f: target.send((file_path,f)) #階段三:收到檔案物件,for迴圈讀取檔案的每一行內容,把每一行內容發給階段四 @init def cat(target): 'read file' while True: filepath,f=yield for line in f: # 有多少行就迴圈多少行 res=target.send((filepath,line)) if res: break #階段四:收到一行內容,判斷root是否在這一行中,如果在,則把檔名發給階段五 @init def grep(target,pattern): 'grep function' tag=False while True: filepath,line=yield tag #target.send((filepath,line)) 返回tag給上個階段,當為true時就不要迴圈了 tag=False if pattern in line: target.send(filepath) tag=True #階段五:收到檔名,列印結果 @init def printer(): 'print function' while True: filename=yield print(filename) start_path1=r'F:\text' # start_path2=r'' g=search(opener(cat(grep(printer(),'root')))) print(g) g.send(start_path1)
這個程式是一步步流水線式的流程,這就是面向過程程式設計
面向過程:
原始的程式設計思想,先做什麼,再做什麼,有幾個階段,一步步實現,流水線形式的
優點:
思路清晰,複雜問題流程化
缺點:
只要有一個流程出錯,那麼全部掛掉,擴充套件性差