在Python中的代碼中經常會見到這兩個詞 args 和 kwargs,前面通常還會加上一個或者兩個星號晋南。其實這只是編程人員約定的變量名字役听,args 是 arguments 的縮寫吓歇,表示位置參數;kwargs 是 keyword arguments 的縮寫尊浪,表示關鍵字參數匣屡。這其實就是 Python 中可變參數的兩種形式,并且 *args 必須放在 **kwargs 的前面拇涤,因為位置參數在關鍵字參數的前面捣作。
*args的用法
*args就是就是傳遞一個可變參數列表給函數實參,這個參數列表的數目未知鹅士,甚至長度可以為0券躁。下面這段代碼演示了如何使用args
def test_args(first, *args):
print('Required argument: ', first)
print(type(args))
for v in args:
print ('Optional argument: ', v)
test_args(1, 2, 3, 4)
第一個參數是必須要傳入的參數,所以使用了第一個形參掉盅,而后面三個參數則作為可變參數列表傳入了實參也拜,并且是作為元組tuple來使用的。代碼的運行結果如下
Required argument: 1
<class 'tuple'>
Optional argument: 2
Optional argument: 3
Optional argument: 4
**kwargs
而**kwargs則是將一個可變的關鍵字參數的字典傳給函數實參趾痘,同樣參數列表長度可以為0或為其他值慢哈。下面這段代碼演示了如何使用kwargs
def test_kwargs(first, *args, **kwargs):
print('Required argument: ', first)
print(type(kwargs))
for v in args:
print ('Optional argument (args): ', v)
for k, v in kwargs.items():
print ('Optional argument %s (kwargs): %s' % (k, v))
test_kwargs(1, 2, 3, 4, k1=5, k2=6)
正如前面所說的,args類型是一個tuple永票,而kwargs則是一個字典dict岸军,并且args只能位于kwargs的前面。代碼的運行結果如下
Required argument: 1
<class 'dict'>
Optional argument (args): 2
Optional argument (args): 3
Optional argument (args): 4
Optional argument k2 (kwargs): 6
Optional argument k1 (kwargs): 5
調用函數
args和kwargs不僅可以在函數定義中使用瓦侮,還可以在函數調用中使用。在調用時使用就相當于pack(打包)和unpack(解包)佣谐,類似于元組的打包和解包肚吏。
首先來看一下使用args來解包調用函數的代碼,
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
args = ("two", 3, 5)
test_args_kwargs(*args)
#result:
arg1: two
arg2: 3
arg3: 5
將元組解包后傳給對應的實參狭魂,kwargs的用法與其類似罚攀。
kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
test_args_kwargs(**kwargs)
#result
arg1: 5
arg2: two
arg3: 3
args和kwargs組合起來可以傳入任意的參數,這在參數未知的情況下是很有效的雌澄,同時加強了函數的可拓展性斋泄。
歡迎大家關注公眾號“計算機視覺與機器學習”
計算機視覺和機器學習