1. 程式人生 > >Python--函數語言程式設計

Python--函數語言程式設計

運用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)

  

這個程式是一步步流水線式的流程,這就是面向過程程式設計

面向過程:

  原始的程式設計思想,先做什麼,再做什麼,有幾個階段,一步步實現,流水線形式的

優點:

  思路清晰,複雜問題流程化

缺點:

  只要有一個流程出錯,那麼全部掛掉,擴充套件性差