剛開始接觸 python 的時候,對 python 中的 wargs (可變參數) 和 kwargs (關鍵字參數)的理解不是很透徹,看了一下 《Explore Python》一書,裡面對這一部分的描述相對淺顯易懂, 這裡依據個人理解進行相關總結。 可變參數( args) 對於可變參數可以聯想到 C ...
剛開始接觸 python 的時候,對 python 中的 *wargs (可變參數) 和 **kwargs (關鍵字參數)的理解不是很透徹,看了一下 《Explore Python》一書,裡面對這一部分的描述相對淺顯易懂, 這裡依據個人理解進行相關總結。
可變參數(*args)
對於可變參數可以聯想到 C# 中的可變參數。可變參數是一個數量不確定的列表集合,可以是 list 類型,也可以是 tuple 類型
我們定義如下代碼段:
def add(*numbers):
print(type(numbers))
sum = 0
for i in numbers:
sum += i
return sum
a1 = (1, 2, 3, 4,)
print(add(*a1))
a2 = [1, 2, 3, 4]
print(add(*a2))
通過運行上述代碼,我們可以看出,無論我們是需要傳遞一個 list 集合還是 tuple 集合,在可變參數對應的函數內部都會作為 tuple 類型來處理。此外,我們還需要註意的是,我們需要傳遞的是集合的指針,而不是該集合對象,這是因為在 python 中,預設通過引用(也就是指針)進行函數的參數傳遞,這樣做避免創建多個拷貝,並且能夠按照方便地更新這些對象。
由於在含可變參數的函數內部,可變參數是作為 tuple 類型來處理的, 因此我們無法對其進行修改。我們可以通過創建一個 list 類型的集合臨時變數,然後通過這個臨時變數實現對傳入的可變參數進行修改。
關鍵字參數(**kwargs)
關鍵字參數是一個由鍵值對組成的集合,允許通過變數名進行匹配,而不是位置。
我們定義如下代碼段:
def add(**kwargs):
print(type(kwargs))
for key in kwargs:
kwargs[key] += 1
print('{0}:{1}'.format(key,kwargs[key]))
dic = {'x': 1, 'y': 2,'z': 3}
add(**dic)
運行上述代碼,我們可以看出,kwargs 的類型為 dict ,因此我們需要用過 key-value 的方式來進行訪問。當我們訪問的 key 不在該參數列表中程式會發生響應。
綜合運用
def test_args_kwargs(arg1, *args, **kwargs):
print(arg1)
for val in args:
print(val)
for k, v in kwargs.items():
print("{0}:{1}".format(k, v))
test_args_kwargs(1, [1, 2, 3], {"a": 1, "b": 2})
總結
*args 和 **kwargs 並不是 python 中的參數關鍵字,而是一種慣用寫法。
在 python 中,函數參數主要分為:必選參數,預設參數,可變參數,關鍵字參數。必選參數必須賦值;預設參數可賦可不賦,如不賦值則傳遞預設的數值;可變參數傳遞的是一個參數列表,列表中的元素數量不確定;關鍵字參數是一個鍵值對集合,通過鍵值對的方式來進行數值傳遞。它們之間的排列順序為:必選參數 -> 預設參數 -> 可變參數 -> 關鍵字參數。