Python編程functools模塊創(chuàng)建修改的高階函數解析
partial 函數
partial 為偏函數(有的地方也叫做部分應用函數),它是對函數的二次封裝,將現有函數的部分參數提前綁定為指定值,然后再進行計算。
由于偏函數的可變參數少,因此函數調用的難度低。
直接展示代碼:
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 錯誤,如下所示:
# 代碼寫成下述內容
show_level("9級")
# 異常如下
TypeError: show() got multiple values for argument 'name'
偏函數也可以通過匿名函數實現,例如下述代碼:
# 代碼寫成下述內容
show_level("9級")
# 異常如下
TypeError: show() got multiple values for argument 'name'
使用 timeit 運行 10 萬次,測試一下二者的時間基本沒有太大差異,所以可以互通使用,不過匿名函數還是實現一些相對簡單的函數。
裝飾器 @lru_cache
給函數添加 @lru_cache 裝飾器,可以加快函數的運行,lru 指最近使用的計算結果會保留在緩存中。
該裝飾器的原型如下:
@functools.lru_cache(maxsize=None, typed=False)
maxsize:最多緩存的次數,如果為 None,則無限制,設置為 2n 時,性能最佳;
typed:如果設置為 True(注意,在 functools32 中沒有此參數),則不同參數類型的調用將分別緩存,例如 f(3) 和 f(3.0)。
接下來通過菲波那切數列的遞歸展示有無 lru_cache 的區(qū)別。
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
差異明顯,這是因為每次執(zhí)行 factorial 時,都會檢查由裝飾器維護的緩存池,如果值存在,直接獲取對應的結果,避免重復計算。
一般的結論是,對于需要重復計算同一組值的應用,使用裝飾器 @lru_cache 可以大幅度提升性能。
reduce 函數
reduce 函數也是高階函數,它可以將可迭代對象中相鄰的兩個值通過指定函數結合在一起,因此 sum,len,max,min 都可以看做是 reduce 函數的特殊形式。
reduce 函數的定義:
reduce(function, sequence [, initial] ) -> value
function參數:是一個有兩個參數的函數,reduce 依次從 sequence 中取一個元素,和上一次調用 function 的結果做參數再次調用 function。
如果第一次沒有指定 initial,則默認使用 sequence 的第一個元素與下一個元素一同傳入二元 function 函數中去執(zhí)行。
讀起來有點繞,直接看案例即可。
from functools import reduce
def add(x, y):
return x + y
a = reduce(add, [1, 2, 3, 4])
print(a)
initial 參數表示初始值,默認情況下是使用序列的第一個值。
from functools import reduce a = reduce(lambda x, y: x + y, [1, 2, 3, 4], 2) print(a)
下面為大家展示如何使用 reduce 實現 sum,len 等函數。
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 函數,代碼如下:
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模塊中創(chuàng)建修改函數的高階函數解析的詳細內容,更多關于Python編程functools模塊創(chuàng)建修改的高階函數的資料請關注腳本之家其它相關文章!
相關文章
Python以簡單方式定義上下文管理器的實戰(zhàn)指南
合理使用上下文管理器可以減少40%以上的資源泄漏問題,并顯著提高代碼的可讀性,本文將深入探討如何以簡單方式定義和使用上下文管理器,從基礎概念到高級技巧,希望對大家有所幫助2025-11-11
Flask的url_for和request.url如何進行URL判斷
這篇文章主要介紹了Flask的url_for和request.url如何進行URL判斷問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07

