函式定義中的引數也就是形式引數,規定了在呼叫函式時如何傳遞實際引數以及這些引數有無預設值。
實參傳遞方式
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,這是兩個不同的概念不要混淆了。