1. 程式人生 > 其它 >3. *args和 **kwargs

3. *args和 **kwargs

技術標籤:python學習筆記python

*args和**kwargs

***可以很方便的分別實現元組(列表、集合)和字典的拆包,拆包顧名思義就是將容器中的元素給一個一個拆出來:

ls1 = [1, 2, 3, 4]
ls2 = [*ls1, 5, 6, 7]
print(ls1)

dic1 = {'one':1, 'two':2, 'three':3}
dic2 = {**dic1 ,'four':4, 'five':5}
print(dic2)

'''
[1, 2, 3, 4]
{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}
'''

​ 但如果將***應用到函式的傳參當中來,那情況將會正好相反,*args可以將所有傳入的非關鍵字引數儲存在args這個元組中,並且順序和你輸入的順序一致,所有的關鍵字引數儲存到kwargs這個字典中,就像下面這樣:

def func(*args, **kwargs):
    print(args)
    print(kwargs)
        
func(1, 3, 5, 7, x=3, y=4, z=3)
'''
(1, 3, 5, 7)
{'x': 1, 'y': 2, 'z': 3}
'''

​ 但是一旦使用*args和**kwargs接收引數,所有的形參和關鍵字引數都要放在最前面,也不要放在中間,否則不僅顯得很low,還會報錯,程式碼如下:

def func(*args, **kwargs, x=3):
    print(args)
    print(kwargs)
        
func(1, 3, 5, 7, x=3, y=4, z=3)

'''
  File "<ipython-input-31-0e57d13e670f>", line 1
    def func(*args, **kwargs, x=3):
                              ^
SyntaxError: invalid syntax
'''

​ args和kwargs並不是固定的,也可以使用其他的名字,但是args和kwargs是比較通用的命名。