快速理解Python不定長度參數*args,**kwargs
*args
跟**kwargs
功能一樣,就是傳遞不定長度的參數
使用時應注意事項
*args,**kwargs
同時出現的話,*args
固定在**kwargs
之前,通常都會2個一起寫。若需求很明確,也可以只寫其中一種*
與**
後面的名稱可以自定,如*vars
或**kwvars
。一般習慣寫成*args,**kwargs
*args
負責將單一參數組成tuple,即myFunc(para1,para2,para3...)
**kwargs
負責將key-value參數組成dict傳入,即myFunc(a=1,b=2,c=3...)
範例
def test_kwargs(**kwargs):
print('kwargs:',kwargs)
def test_args(*args):
print('args:',args)
test_args(1,'a','c',2,'test') # 可以一直無限加參數進去
test_kwargs(a=1,b=2,c=3) # 可以一直無限加參數進去
輸出結果
args:(1, 'a', 'c', 2, 'test')
kwargs:{'a': 1, 'b': 2, 'c': 3}
若傳遞錯誤時,Python會直接報錯
test_args(a=1) #會報錯,因程式沒有**kwargs
test_kwargs('a') #同樣報錯,因沒有*args
進階範例
def test_kwargs(**kwargs):
print('kwargs:',kwargs) # 包成dict印出
print('*kwargs:',*kwargs) # 僅印出key值
#print(**kwargs) # 無法直接使用**kwargs,會報錯
# 但可用迴圈方式得到key,value
print('可用迴圈方式得到key,value')
for k,v in kwargs.items():
print(f'{k} -> {v}')
#自行檢查是否有確實傳入要求的參數
print('自行檢查是否有確實傳入要求的參數')
if 'a' in kwargs:
print('Value in key "a" exists! "a" is',kwargs['a'])
def test_args(*args):
print('args:',args)
print('*args:',*args)
test_args(1,'a','c',2,'test')
print('-----------分隔線------------')
test_kwargs(a=1,b=2,c=3)
輸出結果
args: (1, 'a', 'c', 2, 'test')
*args: 1 a c 2 test
-----------分隔線------------
kwargs: {'a': 1, 'b': 2, 'c': 3}
*kwargs: a b c
可用迴圈方式得到key,value
a -> 1
b -> 2
c -> 3
自行檢查是否有確實傳入要求的參數
Value in key "a" exists! "a" is 1
由以上範例可以知道**kwargs
使用方式基本上等同於dict,使用時不必特地加上**
,直接用kwargs
當參數就可以
雖然使用*kwargs
可以得到KEY值,但需要另存到另一變數後才可以在if
、for-in
中使用,不如就直接用kwargs
來的簡單快速。*args
亦同