Partial Function
Partial Function 的大陸用語為偏函數. Partial 是 “部份” 的意思, 所以在台灣也有人稱為部份函數. C#裏, 很常看到 partial class, 比如 public partial class Pokemon, 意思是指目前這個 class, 只是整個Pokemon類別的一部份, 還有其他部份是放在別的檔案. 不過請注意, Java並沒partial class的機制.
那什麼是Partial Function呢, 意思是指目前的函數, 只擁有母函數的一部份功能. 先以 int()函數進行說明
int(“256”) 可以把字串轉換成整數的 256, 但 int() 是可以接收第二個參數 base, 比如
print(int("ff", 16)) print(int("1111", base=2)) 結果 : 255 15
第二個參數, 可以直接指定為16進位, 或是加上 base=xx, 如果不寫的話, 預設為10進位.
如果現在需要進行大量的二進位轉換, 就需要一直調用 int(“xxx”, base=2), 每次都要寫 “base=2”, 實在是很煩人. 所以就會想說是不是有專門只作二進位轉換的函數呢. 結果查了一大圈後, 發現~~沒有.
即然沒有, 只好自已創造新的自訂函數, 比如叫 int2(). 那麼int2()的演算法要怎麼寫呢? 在強型語言裏, 就要把每個0跟1拆開, 再乘上 2的次方, 然後再加起來.
那麼在Python要怎麼寫呢, 如下
def int2(x):
return int(x, base=2)
print(int2("1000"))
f2=lambda x:int(x,2)
print(f2("01000110"))
太卑鄙了, 竟然調用int()的函數, 然後只是把base 固定為2而以. 這種利用母函數固定某個參數, 而限制只能作單一功能的子函數, 就稱為偏函數.
上面 f2變數, 是Lambda精簡寫法, f2 也是偏函數
functools.partial
functools.partial這個函數, 可以讓我們不用定義函數, 就可以創造出新的int2()函數.
使用這種寫法, 就跟Lambda 一樣簡單. 不過用 functools.partial創造出來的函數, 如下面代碼的 f3, 還是可以更改 base, 而上面用 Lambda產生的 f2, 則無法更改 base. 請看如下代碼
import functools f3=functools.partial(int, base=2) print(f3("01000111")) print(f3("ff", base=16))