1. 程式人生 > >Python3 系列之 可變引數和關鍵字引數

Python3 系列之 可變引數和關鍵字引數

剛開始接觸 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 中,函式引數主要分為:必選引數,預設引數,可變引數,關鍵字引數。必選引數必須賦值;預設引數可賦可不賦,如不賦值則傳遞預設的數值;可變引數傳遞的是一個引數列表,列表中的元素數量不確定;關鍵字引數是一個鍵值對集合,通過鍵值對的方式來進行數值傳遞。它們之間的排列順序為:必選引數 -> 預設引數 -> 可變引數 -> 關鍵字引數。