Python 偏函式介紹及應用
Python的functools模組提供了很多有用的功能,其中一個就是偏函式(Partial function)。要注意,這裡的偏函式和數學意義上的偏函式不一樣。Python 偏函式是透過 functools 模組被使用者呼叫。 |
函式在執行時,要帶上所有必要的引數進行呼叫。但是,有時引數可以在函式被呼叫之前提前獲知。這種情況下,一個函式有一個或多個引數預先就能用上,以便函式能用更少的引數進行呼叫。
偏函式是將所要承載的函式作為partial()函式的第一個引數,原函式的各個引數依次作為partial()函式後續的引數,除非使用關鍵字引數。
透過語言描述可能無法理解偏函式是怎麼使用的,那麼就舉一個常見的例子來說明。在這個例子裡,我們實現了一個取餘函式,對於整數 100,取得對於不同數 m 的 100%m 的餘數。
from functools import partial def mod( n, m ): return n % m mod_by_100 = partial( mod, 100 ) print mod( 100, 7 ) # 2 print mod_by_100( 7 ) # 2
由於之前看到的例子一般選擇加法或乘法來講解,無法體會偏函式引數的位置問題,容易給人造成 partial 的第二個引數也是原函式的第二個引數的假象,所以我在這裡選擇 mod 來講解。
而對於有關鍵字引數的情況下,就可以不按照原函式的引數位置和個數了。下面再看一個例子,講的是如何進行不同的進位制轉換。
from functools import partial bin2dec = partial( int, base=2 ) print bin2dec( '0b10001' ) # 17 print bin2dec( '10001' ) # 17 hex2dec = partial( int, base=16 ) print hex2dec( '0x67' ) # 103 print hex2dec( '67' ) # 103
偏函式的這些應用看似簡單,用途卻很大,可以很好的執行DRY原則,節省程式設計成本。
關於偏函式,可以對現有函式進行加強。
>>> import functools >>> int2 =functools.partial (int, base=2) # 把 int 的轉換設為二進位制了,這裡 base 是 int 函式表示進位制的引數。 >>>int2('1000000') 64 >>>int2('1010101') 85
在重設之後, 也可以在函式呼叫時傳入其他值:
>>> int2('1000000', base=10) # 這裡 base 變成了 10,覆蓋了已設的預設值 2。 1000000
注意這裡在建立新的偏函式後,依舊可以更改已經設定的預設值,但是必須清晰指出是更改了 base 的值。
否則如果直接傳如一個數值會報錯:
int2('100', 10) # 報錯,10 前未加 base=,不能分辨這是傳給 base 的
原因如下:
建立偏函式時,實際上可以接收函式物件、*args 和 **kw 這 3 個引數,當傳入:
int2 =functools.partial(int, base=2) # int 是函式物件,base=2 是 **kw,沒有傳入 *args 引數
實際上固定了 int() 函式的關鍵字引數 base,也就是:
int2('10010')
相當於:
kw = { 'base': 2 } int('10010', **kw) # 如果不指明 base=2 而只是傳入 2 的話,那麼 2 被認為是 *args 的值
當傳入:
max2 =functools.partial(max, 10) # 這裡的 10 顯然就是作為 *args 裡的值傳入的
實際上會把 10 作為 *args 的一部分自動加到引數列表裡去,也就是:
max2(5,6, 7) # 原本有 *args 的列表,然後會把 10 再加進去
相當於:
args = (10, 5, 6, 7) max(*args)
結果為 10。
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2694380/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 函式柯里化和偏函式應用函式
- 正交多項式介紹及應用
- Python偏函式應用舉例-路燈指示牌Python函式
- Sqlite 介紹及應用SQLite
- python的偏函式(partial)Python函式
- match函式簡單介紹以及與index函式結合應用函式Index
- 【Python】python內建函式介紹Python函式
- java的基本函式(介紹)--過載概念、基本應用Java函式
- pandas agg函式的詳細介紹與應用函式
- Python利用partial偏函式生成不同的聚合函式Python函式
- Lucene介紹及簡單應用
- Rsync原理介紹及配置應用
- Python 偏函式用法全方位解析Python函式
- python進階(17)偏函式partialPython函式
- python 中偏函式 partial 的使用Python函式
- Python之函式的相關介紹Python函式
- Python的常用內建函式介紹Python函式
- JavaScript 偏函式JavaScript函式
- 927|偏函式函式
- Scala偏函式函式
- ORACLE函式介紹Oracle函式
- TypeScript 函式介紹TypeScript函式
- Python 應用剖析工具介紹Python
- PostgreSQL之SQL函式介紹及實踐(一)SQL函式
- JMeter36個內建函式及11個新增函式介紹JMeter函式
- 用大白話介紹柯里化函式函式
- 機器學習之簡單介紹啟用函式機器學習函式
- Redis HyperLogLog介紹及應用Redis
- Zookeeper 介紹及典型應用場景
- Python 內建函式:——locals 和 globals介紹Python函式
- python 介紹一個很好用的函式Python函式
- python函式程式設計 返回函式 匿名函式 裝飾器 偏函式Python函式程式設計
- oracle常用函式介紹Oracle函式
- 機器學習基本函式介紹機器學習函式
- replaceChild()函式用法介紹函式
- lpad函式介紹函式
- oracle REPLACE 函式 介紹Oracle函式
- oracle 日期函式介紹Oracle函式