如何在 Python 中使用可變長度參數(*args、**kwargs)

商業

當您查看 Python 代碼並說“這是什麼?

  • *args
  • **kwargs

可以通過將星號附加到函數定義中的參數來指定任意數量的參數(可變長度參數),如下所示

  • *
  • **

名稱 *args,**kwargs 通常用作約定。但是,只要 * 和 ** 在開頭,其他名稱也是可以接受的。以下示例代碼使用名稱 *args,**kwargs。

以下詳細說明如下。

  • *args:接受多個參數作為元組
  • **kwargs:接受多個關鍵字參數作為字典

*args:接受多個參數作為元組

可以通過使用 * 定義參數來指定任意數量的參數,如在 *args 中。

def my_sum(*args):
    return sum(args)

print(my_sum(1, 2, 3, 4))
# 10

print(my_sum(1, 2, 3, 4, 5, 6, 7, 8))
# 36

多個參數在函數中作為元組接收。在示例中,sum() 函數被傳遞一個元組來計算總和。

def my_sum2(*args):
    print('args: ', args)
    print('type: ', type(args))
    print('sum : ', sum(args))

my_sum2(1, 2, 3, 4)
# args:  (1, 2, 3, 4)
# type:  <class 'tuple'>
# sum :  10

它也可以與位置參數結合使用。

在位置參數之後(右側)指定的值作為元組傳遞給 args。如果只有一個位置參數,它是一個空元組。

def func_args(arg1, arg2, *args):
    print('arg1: ', arg1)
    print('arg2: ', arg2)
    print('args: ', args)

func_args(0, 1, 2, 3, 4)
# arg1:  0
# arg2:  1
# args:  (2, 3, 4)

func_args(0, 1)
# arg1:  0
# arg2:  1
# args:  ()

標有 * 的參數可以先定義。但是,在這種情況下,在 *args 之後定義的參數必須以關鍵字形式指定。順便說一句,關鍵字格式是“參數名稱=值”的形式。

最後一個值不會自動傳遞給位置參數。因此,如果沒有將其指定為關鍵字參數,則會導致 TypeError 錯誤。

def func_args2(arg1, *args, arg2):
    print('arg1: ', arg1)
    print('arg2: ', arg2)
    print('args: ', args)

# func_args2(0, 1, 2, 3, 4)
# TypeError: func_args2() missing 1 required keyword-only argument: 'arg2'

func_args2(0, 1, 2, 3, arg2=4)
# arg1:  0
# arg2:  4
# args:  (1, 2, 3)

如果僅指定 * 參數,則必須始終將後續參數指定為關鍵字參數。(keyword-only argument)

def func_args_kw_only(arg1, *, arg2):
    print('arg1: ', arg1)
    print('arg2: ', arg2)

# func_args_kw_only(100, 200)
# TypeError: func_args_kw_only() takes 1 positional argument but 2 were given

func_args_kw_only(100, arg2=200)
# arg1:  100
# arg2:  200

**kwargs:接受多個關鍵字參數作為字典

可以通過使用 ,** 定義參數來指定任意數量的關鍵字參數,如 **kwargs。

在函數中,參數的名稱作為字典接收,其鍵是鍵,值是值。

def func_kwargs(**kwargs):
    print('kwargs: ', kwargs)
    print('type: ', type(kwargs))

func_kwargs(key1=1, key2=2, key3=3)
# kwargs:  {'key1': 1, 'key2': 2, 'key3': 3}
# type:  <class 'dict'>

它也可以與位置參數結合使用。

def func_kwargs_positional(arg1, arg2, **kwargs):
    print('arg1: ', arg1)
    print('arg2: ', arg2)
    print('kwargs: ', kwargs)

func_kwargs_positional(0, 1, key1=1)
# arg1:  0
# arg2:  1
# kwargs:  {'key1': 1}

通過在調用函數時將帶有 ** 的字典對象指定為參數,可以擴展它並將其作為相應的參數傳遞。

d = {'key1': 1, 'key2': 2, 'arg1': 100, 'arg2': 200}

func_kwargs_positional(**d)
# arg1:  100
# arg2:  200
# kwargs:  {'key1': 1, 'key2': 2}

標有 ** 的參數只能在參數末尾定義。在標有 ** 的參數之後定義另一個參數將導致 SyntaxError 錯誤。

# def func_kwargs_error(**kwargs, arg):
#     print(kwargs)

# SyntaxError: invalid syntax