歡迎您光臨本站 註冊首頁

解析Python 偏函數用法全方位實現

←手機掃碼閱讀     kyec555 @ 2020-06-27 , reply:0

Python的functools模塊中有一種函數叫“偏函數”,自從接觸它以來,發現確實是一個很有用且簡單的函數,相信你看完這篇文章,你也有相見恨晚的感覺。

我們都知道,函數入參可以設置默認值來簡化函數調用,而偏函數的作用就是將入參進行默認填充,降低函數使用的難度。

如int()函數,可以將字符型轉換為整型,且默認的都是以十進制形式來轉換,那為什麼一定是十進制呢?如果想用以二進制的形式轉換呢?其實我們可以看一下int函數它本身的定義偏函數,一個讓你相見恨晚的實用函數

可以看到int有兩種用法,可以傳一個位置參數,還可以多傳一個關鍵字參數base,也就是基於什麼格式轉換,默認不傳base參數是以十進制轉換。所以,用二進制形式轉換的話只要base=2即可(見下方代碼)
 

  value = int('10000')  print(value)  # 10000     value = int('10000', base=2)  print(value)  # 16

 

如果每次轉換的字符串的時候都要輸入base參數,顯得很麻煩,因此偏函數的作用就體現出來了,可以使用functools.partial()函數來重新定義

  from functools import partial    int2 = partial(int, base=2)  res = int2('10000')  print(res)   # 16

 

到這裡,你應該已經感覺到了偏函數的一點點魅力吧,那我們再從多個角度進一步看透它。

自定義函數的使用
 

  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)入參並沒有指定哪個關鍵字參數,函數卻默認的將這個值傳給了第一個參數a,那就說明,當沒有指定默認參數時,默認賦值給第一個參數,餘下參數按位置參數賦值。

當入參為可變參數時
 

  def sum(*args):    s = 0    for n in args:      s += n    return s    sum10 = partial(sum, 10)  print(sum10(1))  # 11  print(sum10())   # 10

 

按上述理解,沒有指定默認參數時,默認賦給第一個參數,那麼第一個參數永遠是10,後面再傳入參的話就從第二個參數開始計算,因此會實現10 + 1 = 11 的結果。同樣,如果不繼續傳參的話,只有默認的10,所以結果就是10

當入參為可變關鍵字參數時
 

  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

 

同理,此時入參由於是可變參數,因此默認是第一個傳入,先打印Default關鍵字,這裡關注一下函數的寫法,可變關鍵字參數要寫成(**V)

當入參為限制的關鍵字參數時
 

  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

 

我們知道,當用*號分隔開,表示後面的關鍵字參數是必傳的,因此對於默認參數也是同樣適用,即當參數為必傳時,偏函數也需要對每個關鍵字參數設置默認值。因此修改後為

  studentAge = partial(student, age=20, city='Beijing')  studentAge('Tom') # name: Tom age: 20 city: Beijing

 

綜上,偏函數可以將目標函數的部分參數固化後,重新定義為新的函數,降低了編碼的複雜度,尤其是當參數很多的時候,或者只用到其中某些參數的場景下時,效果更為顯著。

 

   


[kyec555 ] 解析Python 偏函數用法全方位實現已經有230次圍觀

http://coctec.com/docs/python/shhow-post-239899.html