Python編程functools模塊創(chuàng)建修改的高階函數(shù)解析
partial 函數(shù)
partial
為偏函數(shù)(有的地方也叫做部分應(yīng)用函數(shù)),它是對(duì)函數(shù)的二次封裝,將現(xiàn)有函數(shù)的部分參數(shù)提前綁定為指定值,然后再進(jìn)行計(jì)算。
由于偏函數(shù)的可變參數(shù)少,因此函數(shù)調(diào)用的難度低。
直接展示代碼:
from functools import partial # 原函數(shù)聲明 def show(name, level): print("name:", name, "level:", level) # 定義偏函數(shù),封裝 show() 函數(shù),并為 name 參數(shù)設(shè)置了默認(rèn)參數(shù) show_level = partial(show, name='橡皮擦') # 由于 name 參數(shù)已經(jīng)有默認(rèn)值,調(diào)用偏函數(shù)時(shí),name 可以不指定 show_level(level="9級(jí)")
上述代碼就是使用 partial
函數(shù),將一個(gè)函數(shù)的某些參數(shù)(案例中是 name
)進(jìn)行了固定(相當(dāng)于提供了默認(rèn)值),然后再返回一個(gè)新的函數(shù),新函數(shù)參數(shù)也進(jìn)行了減少。
還有一點(diǎn)是上述代碼在調(diào)用 show_level
函數(shù)時(shí),必須使用關(guān)鍵字參數(shù)形式給 level
進(jìn)行傳值,否則會(huì)出現(xiàn) TypeError
錯(cuò)誤,如下所示:
# 代碼寫成下述內(nèi)容 show_level("9級(jí)") # 異常如下 TypeError: show() got multiple values for argument 'name'
偏函數(shù)也可以通過匿名函數(shù)實(shí)現(xiàn),例如下述代碼:
# 代碼寫成下述內(nèi)容 show_level("9級(jí)") # 異常如下 TypeError: show() got multiple values for argument 'name'
使用 timeit
運(yùn)行 10 萬次,測(cè)試一下二者的時(shí)間基本沒有太大差異,所以可以互通使用,不過匿名函數(shù)還是實(shí)現(xiàn)一些相對(duì)簡(jiǎn)單的函數(shù)。
裝飾器 @lru_cache
給函數(shù)添加 @lru_cache
裝飾器,可以加快函數(shù)的運(yùn)行,lru
指最近使用的計(jì)算結(jié)果會(huì)保留在緩存中。
該裝飾器的原型如下:
@functools.lru_cache(maxsize=None, typed=False)
maxsize
:最多緩存的次數(shù),如果為 None,則無限制,設(shè)置為 2n 時(shí),性能最佳;
typed
:如果設(shè)置為 True(注意,在 functools32 中沒有此參數(shù)),則不同參數(shù)類型的調(diào)用將分別緩存,例如 f(3) 和 f(3.0)。
接下來通過菲波那切數(shù)列的遞歸展示有無 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
耗時(shí):0.2; - 帶 耗時(shí):0.06
差異明顯,這是因?yàn)槊看螆?zhí)行 factorial
時(shí),都會(huì)檢查由裝飾器維護(hù)的緩存池,如果值存在,直接獲取對(duì)應(yīng)的結(jié)果,避免重復(fù)計(jì)算。
一般的結(jié)論是,對(duì)于需要重復(fù)計(jì)算同一組值的應(yīng)用,使用裝飾器 @lru_cache
可以大幅度提升性能。
reduce 函數(shù)
reduce
函數(shù)也是高階函數(shù),它可以將可迭代對(duì)象中相鄰的兩個(gè)值通過指定函數(shù)結(jié)合在一起,因此 sum
,len
,max
,min
都可以看做是 reduce
函數(shù)的特殊形式。
reduce 函數(shù)的定義:
reduce(function, sequence [, initial] ) -> value
function參數(shù)
:是一個(gè)有兩個(gè)參數(shù)的函數(shù),reduce
依次從 sequence
中取一個(gè)元素,和上一次調(diào)用 function
的結(jié)果做參數(shù)再次調(diào)用 function
。
如果第一次沒有指定 initial
,則默認(rèn)使用 sequence
的第一個(gè)元素與下一個(gè)元素一同傳入二元 function
函數(shù)中去執(zhí)行。
讀起來有點(diǎn)繞,直接看案例即可。
from functools import reduce def add(x, y): return x + y a = reduce(add, [1, 2, 3, 4]) print(a)
initial
參數(shù)表示初始值,默認(rèn)情況下是使用序列的第一個(gè)值。
from functools import reduce a = reduce(lambda x, y: x + y, [1, 2, 3, 4], 2) print(a)
下面為大家展示如何使用 reduce
實(shí)現(xiàn) sum
,len
等函數(shù)。
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
函數(shù)與 partical
函數(shù)實(shí)現(xiàn) sum
函數(shù),代碼如下:
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)建修改函數(shù)的高階函數(shù)解析的詳細(xì)內(nèi)容,更多關(guān)于Python編程functools模塊創(chuàng)建修改的高階函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python functools模塊學(xué)習(xí)總結(jié)
- Python中functools模塊的常用函數(shù)解析
- Python中functools模塊函數(shù)解析
- Python使用functools實(shí)現(xiàn)注解同步方法
- Python3標(biāo)準(zhǔn)庫(kù)之functools管理函數(shù)的工具詳解
- Python的functools模塊使用及說明
- Python庫(kù)functools示例詳解
- Python中的functools partial詳解
- python高階函數(shù)functools模塊的具體使用
- Python中Functools模塊的高級(jí)操作詳解
- Python函數(shù)式編程模塊functools的使用與實(shí)踐
相關(guān)文章
python解析html開發(fā)庫(kù)pyquery使用方法
PyQuery是一個(gè)類似于jQuery的Python庫(kù),也可以說是jQuery在Python上的實(shí)現(xiàn),能夠以jQuery的語法來操作解析 HTML 文檔,易用性和解析速度都很好2014-02-02Python實(shí)現(xiàn)快速排序算法及去重的快速排序的簡(jiǎn)單示例
quick sort快速排序是一種再基礎(chǔ)不過的排序算法,使用Python代碼寫起來相當(dāng)簡(jiǎn)潔,這里我們就來看一下Python實(shí)現(xiàn)快速排序算法及去重的快速排序的簡(jiǎn)單示例:2016-06-06Python?input輸入超時(shí)選擇默認(rèn)值自動(dòng)跳過問題
這篇文章主要介紹了Python?input輸入超時(shí)選擇默認(rèn)值自動(dòng)跳過問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Python并發(fā)之多進(jìn)程的方法實(shí)例代碼
這篇文章主要介紹了Python并發(fā)之多進(jìn)程的方法實(shí)例代碼,文中也提到了進(jìn)程與線程的共同點(diǎn),需要的朋友跟隨腳本之家小編一起看看吧2018-08-08python Pexpect 實(shí)現(xiàn)輸密碼 scp 拷貝的方法
今天小編就為大家分享一篇python Pexpect 實(shí)現(xiàn)輸密碼 scp 拷貝的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01Python Django教程之實(shí)現(xiàn)待辦事項(xiàng)應(yīng)用程序
Django是一個(gè)基于Python Web框架的高級(jí)Web框架,允許快速開發(fā)和干凈,務(wù)實(shí)的設(shè)計(jì)。本文將創(chuàng)建一個(gè)待辦事項(xiàng)應(yīng)用程序,以了解Django的基礎(chǔ)知識(shí),感興趣的可以嘗試一下2022-10-10python實(shí)現(xiàn)屏保計(jì)時(shí)器的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)屏保計(jì)時(shí)器的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08python區(qū)塊鏈簡(jiǎn)易版交易實(shí)現(xiàn)示例
這篇文章主要為大家介紹了python區(qū)塊鏈簡(jiǎn)易版交易實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05