本文我們將通過示例瞭解 Python函式的可變引數*args
和 **kwargs
的用法。
知識預備:Python 函式和 Python 函式引數
在Python程式設計中,我們定義一個函式來生成執行類似操作的可重用程式碼。為了執行這個操作,我們呼叫一個具有特定值的函式,這個值在 Python 中稱為函式引數。
函式示例
假設,我們定義了一個3個數相加的函式。
示例1: 用於加3個數字的函式
# 定義函式
def add(x, y, z):
print(f"總和: {x+y+z}")
# 呼叫函式
add(10,12,13)
當我們執行上面的程式時,將會輸出如下結果:
總和: 35
在上面的程式中,我們有三個引數 x,y 和 z 的加法函式。當我們在呼叫 add()函式傳遞三個值時,我們得到這三個數字的和作為輸出。
接下來,讓我們看看當我們在add()函式中傳遞超過3個引數時會發生什麼。
# 定義函式
def add(x, y, z):
print(f"總和: {x+y+z}")
# 呼叫函式
add(5,10,15,20,25)
當我們執行上面的程式時,輸出將是
TypeError: add() takes 3 positional arguments but 5 were given
在上面的程式中,我們給add()函式傳遞了5個引數,而不是由於3個引數,並且得到 TypeError 錯誤。
這很顯然不是我們想要的效果,那麼應該怎麼解決這個問題呢?
如果我們實際呼叫的時候,如果入參的個數是不確定的,就可以使用可變引數的語法來解決。
Python可變引數
在 Python 中,我們可以使用特殊符號向函式傳遞可變數量的引數。
有兩個特殊的符號:
*args
:可變位置引數**kwargs
:可變關鍵字引數
當我們不確定要在函式中傳遞的引數數量時,我們就可以在函式定義中,使用 *args
和 **kwargs
作為形式引數。
Python *args
正如上面的例子一樣,我們不確定可以傳遞給函式的引數數量。有 *args
,允許我們傳遞可變數量的非關鍵字引數到函式中。
在函式定義中,我們應該在引數名之前使用星號 *
來傳遞可變長度的引數。引數以元組的形式傳遞,這些傳遞的引數在函式內部使用與引數(不包括星號 *)相同的名稱構成元組。
例2: 使用 *args
將可變長度的引數傳遞給函式
# 定義函式
def add(*num):
sum = 0
for n in num:
sum = sum + n
print(f"總和: {sum}")
# 呼叫函式
add(3,5)
add(4,5,6,7)
add(1,2,3,5,6)
在上面的程式中,我們使用 *num
宣告形式引數,它允許我們向 add()
函式傳遞可變長度的引數列表。在函式內部,我們有一個迴圈,它把傳遞的實際引數相加,並列印結果。注意,這裡呼叫了3次,分別傳遞了不同的值,它們的長度可變,作為函式的實際引數。
當我們執行上面的程式時,輸出將是:
總和: 8
總和: 22
總和: 17
Python **kwargs
對於傳遞關鍵字引數這個問題,Python 有一個名為 **kwargs
的解決方案,它允許我們將可變長度的關鍵字引數傳遞給函式。
具體做法是,在函式中,我們在引數名之前使用雙星號**
來表示這種型別的引數。接收到的引數在函式內構成一個dict字典物件,
其名稱與引數(不包括兩個星號**
)相同。
示例3: 使用 **kwargs
將可變關鍵字引數傳遞給函式
# 定義函式
def intro(**data):
print("實參的資料型別是:", type(data))
for key, value in data.items():
print(f"{key} is {value}")
# 呼叫函式
intro(name="小佛", age=30)
intro(city="深圳", lan="Python", hobby="乾飯")
在上面的程式中,我們定義了一個以 **data
資料為形參的函式 intro ()。我們將兩個長度可變的字典實參傳遞給 intro()
函式。
我們intro()
函式中使用for迴圈,它對傳遞字典的資料項進行處理,並輸出字典的值。
當我們執行上面的程式時,輸出結果將是:
實參的資料型別是: <class 'dict'>
name:小佛
age:30
實參的資料型別是: <class 'dict'>
city:深圳
lan:Python
hobby:乾飯
總結
值得注意的幾點:
*args
和**kwargs
是特殊的關鍵字,允許函式採用可變長度引數,讓函式變得非常靈活。*args
和**kwargs
是約定俗稱的名稱,可以自定義,例如*cat
,或者**dog
。*args
傳遞可變數量的位置引數,並且可以在其上執行元組的操作。**kwargs
傳遞可變數目的關鍵字引數,以便在其上執行字典的操作。
--- END