partial 函數
partial
為偏函數(有的地方也叫做部分應用函數),它是對函數的二次封裝,將現有函數的部分參數提前綁定為指定值,然后再進行計算。
由于偏函數的可變參數少,因此函數調用的難度低。
直接展示代碼:
1
2
3
4
5
6
7
8
|
from functools import partial # 原函數聲明 def show(name, level): print ( "name:" , name, "level:" , level) # 定義偏函數,封裝 show() 函數,并為 name 參數設置了默認參數 show_level = partial(show, name = '橡皮擦' ) # 由于 name 參數已經有默認值,調用偏函數時,name 可以不指定 show_level(level = "9級" ) |
上述代碼就是使用 partial
函數,將一個函數的某些參數(案例中是 name
)進行了固定(相當于提供了默認值),然后再返回一個新的函數,新函數參數也進行了減少。
還有一點是上述代碼在調用 show_level
函數時,必須使用關鍵字參數形式給 level
進行傳值,否則會出現 TypeError
錯誤,如下所示:
1
2
3
4
|
# 代碼寫成下述內容 show_level( "9級" ) # 異常如下 TypeError: show() got multiple values for argument 'name' |
偏函數也可以通過匿名函數實現,例如下述代碼:
1
2
3
4
|
# 代碼寫成下述內容 show_level( "9級" ) # 異常如下 TypeError: show() got multiple values for argument 'name' |
使用 timeit
運行 10 萬次,測試一下二者的時間基本沒有太大差異,所以可以互通使用,不過匿名函數還是實現一些相對簡單的函數。
裝飾器 @lru_cache
給函數添加 @lru_cache
裝飾器,可以加快函數的運行,lru
指最近使用的計算結果會保留在緩存中。
該裝飾器的原型如下:
1
|
@functools .lru_cache(maxsize = None , typed = False ) |
maxsize
:最多緩存的次數,如果為 None,則無限制,設置為 2n 時,性能最佳;
typed
:如果設置為 True(注意,在 functools32 中沒有此參數),則不同參數類型的調用將分別緩存,例如 f(3) 和 f(3.0)。
接下來通過菲波那切數列的遞歸展示有無 lru_cache
的區別。
1
2
3
4
5
6
7
|
from functools import lru_cache import timeit @lru_cache () def factorial(n): return 1 if n < = 1 else n * factorial(n - 1 ) a = timeit.timeit(stmt = "factorial(20)" , setup = 'from __main__ import factorial' , number = 100000 ) print (a) |
-
不帶
lru_cache
耗時:0.2; - 帶 耗時:0.06
差異明顯,這是因為每次執行 factorial
時,都會檢查由裝飾器維護的緩存池,如果值存在,直接獲取對應的結果,避免重復計算。
一般的結論是,對于需要重復計算同一組值的應用,使用裝飾器 @lru_cache
可以大幅度提升性能。
reduce 函數
reduce
函數也是高階函數,它可以將可迭代對象中相鄰的兩個值通過指定函數結合在一起,因此 sum
,len
,max
,min
都可以看做是 reduce
函數的特殊形式。
reduce 函數的定義:
reduce(function, sequence [, initial] ) -> value
function參數
:是一個有兩個參數的函數,reduce
依次從 sequence
中取一個元素,和上一次調用 function
的結果做參數再次調用 function
。
如果第一次沒有指定 initial
,則默認使用 sequence
的第一個元素與下一個元素一同傳入二元 function
函數中去執行。
讀起來有點繞,直接看案例即可。
1
2
3
4
5
|
from functools import reduce def add(x, y): return x + y a = reduce (add, [ 1 , 2 , 3 , 4 ]) print (a) |
initial
參數表示初始值,默認情況下是使用序列的第一個值。
1
2
3
|
from functools import reduce a = reduce ( lambda x, y: x + y, [ 1 , 2 , 3 , 4 ], 2 ) print (a) |
下面為大家展示如何使用 reduce
實現 sum
,len
等函數。
1
2
3
4
5
6
7
8
9
|
from functools import reduce data = [ 1 , 2 , 3 , 4 ] sum = lambda data: reduce ( lambda x, y: x + y, data, 0 ) count = lambda data: reduce ( lambda x, y: x + 1 , data, 0 ) min = lambda data: reduce ( lambda x, y: x if x < y else y, data) a = sum (data) b = count(data) c = min (data) print (a, b, c) |
還可以使用 reduce
函數與 partical
函數實現 sum
函數,代碼如下:
1
2
3
4
5
|
from functools import reduce , partial data = [ 1 , 2 , 3 , 4 ] sum = partial( reduce , lambda x, y: x + y) a = sum (data) print (a) |
以上就是Python編程functools模塊中創建修改函數的高階函數解析的詳細內容,更多關于Python編程functools模塊創建修改的高階函數的資料請關注服務器之家其它相關文章!
原文鏈接:https://dream.blog.csdn.net/article/details/120204099