1. 程式人生 > >Python--高階函數及其裝飾器

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--高階函數及其裝飾器