快速理解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...)

範例

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