一、描述
- *args:任意個無名參數,類型為tuple或list
- **kwargs:任意個關鍵字參數(key-word args,鍵值對),類型為dict
二、功能
- 任意數目參數的接收
- 集合參數的分解
1.任意數目參數的接收——打包操作
示例(函數傳參):
def func(a,*arg,**kwargs):#*args需放在**kwargs之前,否則出現語法錯誤
print(a)
print(arg)
print(kwargs)
func(1,2,3,4,key1=1,key2=2)
func(1,2,3,4,{'key1:1,key2:2'})
輸出:
1
(2, 3, 4) #將參數轉換為tuple類型
{'key1': 1, 'key2': 2} #將參數轉換為dict類型
---------------------------------------
1
(2, 3, 4, {'key1:1,key2:2'})
{}
#字典形式非獨立的鍵值對(字典是打包好的鍵值對)
#會以整體形式被*args識別為無名參數
示例(賦值操作):
_,*args,_=[1,2,3,4] #_表示占位,接收一個元素賦值后丟棄
*args=[1,2,3,4]
輸出:
[2, 3] #*args在賦值操作中將元素打包為list,在函數中將元素打包為tuple
----------------------------------------------------
starred assignment target must be in a list or tuple
#*args必須出現在列表或元組中
#對於_,*args,_=[1,2,3,4]無報錯,個人理解該形式組成了一個序列
2.集合參數的分解——解包操作
示例:
def func1(a,b,*args):
print(a)
print(b)
print(args)
def func2(a,c,**kw):
print(a)
print(c)
print(kw)
func1(*[1,2,3,4])
func2(**{'a':1,'b':2,'c':3,'d':4})
輸出:
1
2
(3, 4) #3,4被*args接收並重新打包
----------------------------------
1
3
{'b': 2, 'd': 4}
#**{'a':1,'b':2,'c':3,'d':4}將dict解包
#區別於字典整體,作為獨立鍵值對可被**kw接收
#a,c鍵接收對應值,b,d鍵值對被**kw接收並重新打包
三、總結
- *args可實現任意無名參數的tuple or list打包,tuple or list 的解包
- **kwargs可實現任意鍵值對的dict打包,dict 的解包
- 對無名參數或鍵值對的解包操作、tuple/list/dict的打包操作均會報錯,注意使用*或**操作時對象的狀態
四、引用
本文引用徐玖python,在此感謝!