十三、面向過程編程
阿新 • • 發佈:2017-11-28
思路 with 進入 dex function index bsp text .html
運用上次的 yiled
模擬 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)
這個程序是一步步流水線式的流程,這就是面向過程編程
面向過程:
原始的編程思想,先做什麽,再做什麽,有幾個階段,一步步實現,流水線是
優點:
思路清晰,復雜問題流程化
缺點:
只要有一個流程出錯,那麽全部掛掉,擴展性差
十三、面向過程編程