Python--高階函數及其裝飾器
函數式編程
? 函數可以認為是變量, 因此函數名可以作為參數傳入函數;這樣的函數稱為高階函數;
內置高階函數
? map
map(function, sequence[, sequence, ...]) -> list
對sequence序列中的每一個元素item依次執行function(item)函數 操作,最終返回一個
? 列表;
reduce
reduce(function, sequence[, initial]) -> value
對於序列中的每個元素叠代調用function函數;
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) =====》 (((1+2)+3)+4)+5).
註意的點: function必須要有兩個參數;
? filter函數
filter(function or None, sequence) -> list, tuple, or string
註意: function函數返回值為bool類型
? sorted函數
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
cmp=用於比較的函數, 返回值一定和cmp函數的返回值對應(1,-1,0);
# map/reduce
# li.sort() 作用於列表本身 ; 只能用於列表排序 ;
# sorted 返回一個新的對象 , 可以對任意可叠代的對象進行排序 ;
# sorted 逆序排序
函數作為形參傳入函數
函數作為返回值
def fun(a, b): return xx
閉包(closure)
裝飾器
- 器,可以理解為函數;
- 裝飾器實質上是用來裝飾函數的;
- 裝飾器就是在原來功能基礎上加上一些其他功能,即在程序執行前或者執行後- 加上需要的操作;
- 裝飾器的功能,比如:權限的驗證,日誌記錄, 函數運行時間統計, 執行函數前
預備處理, 執行函數後清理功能等;
- 產品經理, 開發人員之間的愛恨情仇
? 理解裝飾器的實質(建議在pycharm中debug調試,查看運行過程)
? 裝飾器應用之函數計時器
被裝飾的函數有參數
案例參照上述代碼
? 必選參數
? 默認參數
? 可變參數(註意: 盡量使用,通用性比較強)
? 關鍵字參數
裝飾器帶參數
裝飾器案例之引入日誌
? 添加裝飾器@myLogger的函數都會記錄日誌
? 日誌格式為 什麽時間 start 什麽函數 函數參數
? 文件操作學習後的升級: 把日誌信息記錄到文件/var/log/myfun.log中;
練習
- 編寫Logger裝飾器,實現被裝飾的函數運行結束後,打印日誌的信息;
- 日誌格式內容為:時間、函數名、運行時間;
- 被裝飾的函數可以接收任意個參數;
- 裝飾器可以傳參數,並將裝飾器傳的參數打印出來
- 裝飾器顯示為:“裝飾器所傳參數為:xxx”
Python--高階函數及其裝飾器