高階函數
函數式編程
• 函數可以認爲是變量, 因此函數名可以作爲參數傳入函數;這樣的函數稱爲高階函數;
內置高階函數
• 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”