解析Python 偏函數(shù)用法全方位實(shí)現(xiàn)
Python的functools模塊中有一種函數(shù)叫“偏函數(shù)”,自從接觸它以來,發(fā)現(xiàn)確實(shí)是一個很有用且簡單的函數(shù),相信你看完這篇文章,你也有相見恨晚的感覺。
我們都知道,函數(shù)入?yún)⒖梢栽O(shè)置默認(rèn)值來簡化函數(shù)調(diào)用,而偏函數(shù)的作用就是將入?yún)⑦M(jìn)行默認(rèn)填充,降低函數(shù)使用的難度。
如int()函數(shù),可以將字符型轉(zhuǎn)換為整型,且默認(rèn)的都是以十進(jìn)制形式來轉(zhuǎn)換,那為什么一定是十進(jìn)制呢?如果想用以二進(jìn)制的形式轉(zhuǎn)換呢?其實(shí)我們可以看一下int函數(shù)它本身的定義偏函數(shù),一個讓你相見恨晚的實(shí)用函數(shù)
可以看到int有兩種用法,可以傳一個位置參數(shù),還可以多傳一個關(guān)鍵字參數(shù)base,也就是基于什么格式轉(zhuǎn)換,默認(rèn)不傳base參數(shù)是以十進(jìn)制轉(zhuǎn)換。所以,用二進(jìn)制形式轉(zhuǎn)換的話只要base=2即可(見下方代碼)
value = int('10000') print(value) # 10000 value = int('10000', base=2) print(value) # 16
如果每次轉(zhuǎn)換的字符串的時(shí)候都要輸入base參數(shù),顯得很麻煩,因此偏函數(shù)的作用就體現(xiàn)出來了,可以使用functools.partial()函數(shù)來重新定義
from functools import partial int2 = partial(int, base=2) res = int2('10000') print(res) # 16
到這里,你應(yīng)該已經(jīng)感覺到了偏函數(shù)的一點(diǎn)點(diǎn)魅力吧,那我們再從多個角度進(jìn)一步看透它。
自定義函數(shù)的使用
def add(a, b, c): print('a=',a,'b=',b,'c=',c) return a + b + c add10 = partial(add, 10) res = add10(1, 2) # a= 10 b= 1 c= 2
如上代碼中,partial(add, 10)入?yún)⒉]有指定哪個關(guān)鍵字參數(shù),函數(shù)卻默認(rèn)的將這個值傳給了第一個參數(shù)a,那就說明,當(dāng)沒有指定默認(rèn)參數(shù)時(shí),默認(rèn)賦值給第一個參數(shù),余下參數(shù)按位置參數(shù)賦值。
當(dāng)入?yún)榭勺儏?shù)時(shí)
def sum(*args): s = 0 for n in args: s += n return s sum10 = partial(sum, 10) print(sum10(1)) # 11 print(sum10()) # 10
按上述理解,沒有指定默認(rèn)參數(shù)時(shí),默認(rèn)賦給第一個參數(shù),那么第一個參數(shù)永遠(yuǎn)是10,后面再傳入?yún)⒌脑捑蛷牡诙€參數(shù)開始計(jì)算,因此會實(shí)現(xiàn)10 + 1 = 11 的結(jié)果。同樣,如果不繼續(xù)傳參的話,只有默認(rèn)的10,所以結(jié)果就是10
當(dāng)入?yún)榭勺冴P(guān)鍵字參數(shù)時(shí)
D = {'value1':10, 'value2':20} V = {'Default':100} def show(**kw): for k in kw: print(k, kw.get(k)) showDef = partial(show, **V) showDef(**D) # Default 100 # value1 10 # value2 20
同理,此時(shí)入?yún)⒂捎谑强勺儏?shù),因此默認(rèn)是第一個傳入,先打印Default關(guān)鍵字,這里關(guān)注一下函數(shù)的寫法,可變關(guān)鍵字參數(shù)要寫成(**V)
當(dāng)入?yún)橄拗频年P(guān)鍵字參數(shù)時(shí)
def student(name, * , age, city): print('name:',name, 'age:',age, 'city:',city) studentAge = partial(student, age=20) studentAge('Tom','Beijing') # TypeError: student() takes 1 positional argument but 2 positional arguments (and 1 keyword-only argument) were given
我們知道,當(dāng)用*號分隔開,表示后面的關(guān)鍵字參數(shù)是必傳的,因此對于默認(rèn)參數(shù)也是同樣適用,即當(dāng)參數(shù)為必傳時(shí),偏函數(shù)也需要對每個關(guān)鍵字參數(shù)設(shè)置默認(rèn)值。因此修改后為
studentAge = partial(student, age=20, city='Beijing') studentAge('Tom') # name: Tom age: 20 city: Beijing
綜上,偏函數(shù)可以將目標(biāo)函數(shù)的部分參數(shù)固化后,重新定義為新的函數(shù),降低了編碼的復(fù)雜度,尤其是當(dāng)參數(shù)很多的時(shí)候,或者只用到其中某些參數(shù)的場景下時(shí),效果更為顯著。
到這里,你是否有了相見恨晚的感覺呢?簡單函數(shù)小技巧,非常實(shí)用的偏函數(shù)用法就介紹完了,更多相關(guān)Python 偏函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyQT5之使用QT?Designer創(chuàng)建基本窗口方式
這篇文章主要介紹了PyQT5之使用QT?Designer創(chuàng)建基本窗口方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02Python django框架輸入漢字,數(shù)字,字符生成二維碼實(shí)現(xiàn)詳解
這篇文章主要介紹了Python django框架輸入漢字,數(shù)字,字符轉(zhuǎn)成二維碼實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Django中使用 Closure Table 儲存無限分級數(shù)據(jù)
對于數(shù)據(jù)量大的情況(比如用戶之間有邀請鏈,有點(diǎn)三級分銷的意思),就要用到 closure table 的結(jié)構(gòu)來進(jìn)行存儲。這篇文章主要介紹了Django中使用 Closure Table 儲存無限分級數(shù)據(jù),需要的朋友可以參考下2019-06-06Python實(shí)現(xiàn)批量梯度下降法(BGD)擬合曲線
這篇文章主要介紹了Python實(shí)現(xiàn)批量梯度下降法(BGD)擬合曲線,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04關(guān)于TensorFlow新舊版本函數(shù)接口變化詳解
今天小編就為大家分享一篇關(guān)于TensorFlow新舊版本函數(shù)接口變化詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02