一文看懂 Python 中的函式引數

zikcheng發表於2023-02-13

函式定義中的引數也就是形式引數,規定了在呼叫函式時如何傳遞實際引數以及這些引數有無預設值。

實參傳遞方式

def f(a):
    print(a)

實參傳遞方式有兩種,位置和關鍵字。對於上面定義的函式 f,形如 f(1) 這種呼叫是透過位置的方式傳參,形如 f(a=1) 這種呼叫是透過關鍵字的方式傳參,兩種傳參方式都可以是因為形參 a 沒有對傳參方式做限制。

Python 也提供了一些方式用來限制引數的傳遞方式。

僅限位置引數

def f(a, b, /, d):
	pass

對於這種定義,斜槓 / 之前的引數 a 和 b 只能透過位置引數的方式傳參,叫做僅限位置引數,斜槓 / 之後的引數 d 既可以透過位置也可以透過關鍵字的方式傳參,所以 f(1, 2, d=3)f(1, 2, 3) 都可以呼叫函式。

僅限關鍵字引數

def f(a, b, *, d):
	pass

定義中星號 * 後面的引數 d 只能透過關鍵字的方式傳參,叫做僅限關鍵字引數,星號 * 前面的引數 a 和 b 既可以透過位置也可以透過關鍵字的方式傳參,所以 f(1, 2, d=3)f(1, b=2, d=3) 都可以呼叫函式。

當然星號 * 和斜槓 / 也可以同時定義,如下

def f(a, /, b, *, c):
	pass

a 只能透過位置傳參,c 只能透過關鍵字傳參,b 都可以,所以只有 f(1, 2, c=3)f(1, b=2, c=3) 這兩種呼叫方式。

引數的預設值

函式定義中無論規定形參的傳遞方式是哪種,都可以透過 k=v 的形式設定引數的預設值,如果有引數設定了預設值,那麼在呼叫函式的時候可以省略對該引數的傳值。所以上面說的實參傳遞方式,更準確的描述是:如果僅限關鍵字引數沒有設定預設值,那麼只能透過關鍵字的形式傳參,否則可以省略該引數的傳遞,如果僅限位置引數沒有設定預設值,那麼只能透過位置的形式傳參,否則可以省略該引數的傳遞。

下面看一個例子作總結

def f(a, b=10, /, c=1, *, d=20, e):
	pass

b 是僅限位置引數有預設值,e 是僅限關鍵字引數沒有預設值。函式定義中出現的 k=v 這種形式表示引數 k 有預設值 v,函式呼叫中出現的 k=v 的形式表示透過關鍵字的方式給引數 k 傳遞引數值 v,這是兩個不同的概念不要混淆了。

相關文章