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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM