鍍金池/ 教程/ Python/ partial 函數(shù)
基礎(chǔ)
itertools
HTTP 服務(wù)
hashlib
閉包
文件和目錄
單元測(cè)試
使用 @property
標(biāo)準(zhǔn)模塊
陌生的 metaclass
Base64
進(jìn)程、線程和協(xié)程
讀寫二進(jìn)制文件
匿名函數(shù)
輸入和輸出
Click
元組
字符編碼
partial 函數(shù)
參考資料
collections
協(xié)程
類和實(shí)例
Python 之旅
定制類和魔法方法
常用數(shù)據(jù)類型
繼承和多態(tài)
ThreadLocal
HTTP 協(xié)議簡(jiǎn)介
Requests 庫的使用
讀寫文本文件
列表
os 模塊
迭代器 (Iterator)
正則表達(dá)式
集合
上下文管理器
異常處理
你不知道的 super
定義函數(shù)
datetime
資源推薦
字典
slots 魔法
hmac
第三方模塊
進(jìn)程
類方法和靜態(tài)方法
函數(shù)參數(shù)
高階函數(shù)
函數(shù)
re 模塊
高級(jí)特性
線程
argparse
生成器
結(jié)束語
字符串
map/reduce/filter
函數(shù)式編程
Celery
裝飾器

partial 函數(shù)

Python 提供了一個(gè) functools 的模塊,該模塊為高階函數(shù)提供支持,partial 就是其中的一個(gè)函數(shù),該函數(shù)的形式如下:

functools.partial(func[,*args][, **kwargs])

這里先舉個(gè)例子,看看它是怎么用的。

假設(shè)有如下函數(shù):

def multiply(x, y):
    return x * y

現(xiàn)在,我們想返回某個(gè)數(shù)的雙倍,即:

>>> multiply(3, y=2)
6
>>> multiply(4, y=2)
8
>>> multiply(5, y=2)
10

上面的調(diào)用有點(diǎn)繁瑣,每次都要傳入 y=2,我們想到可以定義一個(gè)新的函數(shù),把 y=2 作為默認(rèn)值,即:

def double(x, y=2):
    return multiply(x, y)

現(xiàn)在,我們可以這樣調(diào)用了:

>>> double(3)
6
>>> double(4)
8
>>> double(5)
10

事實(shí)上,我們可以不用自己定義 double,利用 partial,我們可以這樣:

from functools import partial

double = partial(multiply, y=2)

partial 接收函數(shù) multiply 作為參數(shù),固定 multiply 的參數(shù) y=2,并返回一個(gè)新的函數(shù)給 double,這跟我們自己定義 double 函數(shù)的效果是一樣的。

所以,簡(jiǎn)單而言,partial 函數(shù)的功能就是:把一個(gè)函數(shù)的某些參數(shù)給固定住,返回一個(gè)新的函數(shù)。

需要注意的是,我們上面是固定了 multiply 的關(guān)鍵字參數(shù) y=2,如果直接使用:

double = partial(multiply, 2)

2 是賦給了 multiply 最左邊的參數(shù) x,不信?我們可以驗(yàn)證一下:

from functools import partial

def subtraction(x, y):
    return x - y

f = partial(subtraction, 4)  # 4 賦給了 x
>>> f(10)   # 4 - 10
-6

小結(jié)

  • partial 的功能:固定函數(shù)參數(shù),返回一個(gè)新的函數(shù)。
  • 當(dāng)函數(shù)參數(shù)太多,需要固定某些參數(shù)時(shí),可以使用 functools.partial 創(chuàng)建一個(gè)新的函數(shù)。

參考資料

上一篇:re 模塊下一篇:集合