快速理解Python不定長度參數*args,**kwargs

*args**kwargs功能一樣,就是傳遞不定長度的參數

使用時應注意事項

  1. *args,**kwargs同時出現的話,*args固定在**kwargs之前,通常都會2個一起寫。若需求很明確,也可以只寫其中一種
  2. ***後面的名稱可以自定,如*vars**kwvars。一般習慣寫成*args,**kwargs
  3. *args負責將單一參數組成tuple,即myFunc(para1,para2,para3...)
  4. **kwargs負責將key-value參數組成dict傳入,即myFunc(a=1,b=2,c=3...)

範例

1
2
3
4
5
6
7
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) # 可以一直無限加參數進去

輸出結果

1
2
args:(1, 'a', 'c', 2, 'test')
kwargs:{'a': 1, 'b': 2, 'c': 3}

若傳遞錯誤時,Python會直接報錯

1
2
test_args(a=1)     #會報錯,因程式沒有**kwargs
test_kwargs('a') #同樣報錯,因沒有*args

進階範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

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)

輸出結果

1
2
3
4
5
6
7
8
9
10
11
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值,但需要另存到另一變數後才可以在iffor-in中使用,不如就直接用kwargs來的簡單快速。*args亦同