當您查看 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