一、描述
- *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,在此感谢!