*args
- *args 是为了传入任意不定数量的参数
- 所有的不定参数都在 args 外面,造成一个 tuple 传入函数外部
- *args 个别用在关键字参数前面
def func(a,*args):
print(type(args))
print(args)
print(a)
>>>func(1)
<class 'tuple'>
()
1
>>>func(10,2,'a')
<class 'tuple'>
(2, 'a')
10
>>>func(1,2,m=3)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: func() got an unexpected keyword argument 'm'
args 参数不能接管关键字,只须要间接传参数值。接管关键字的是后续的 *kwargs
**kwargs
- **kwargs 是为了传入任意不定数量的关键字参数
- 最初传入的不定数量的关键字参数都在 kwargs 外面,造成一个 dict 传入函数
- **kwargs 只能放在函数最初一个参数。
- 函数参数的个别程序是:关键字参数,args,*kwargs
def func(x,y,*t,**test):
print(type(test))
print(test.keys())
print(test.values())
res1=sum(t)
res2=sum(test.values())
print('res1:%s'%(res1))
print('res2:%s'%(res2))
return res1,res2
>>>func(1,2,10,20,m=100,n=200)
<class 'dict'>
dict_keys(['m', 'n'])
dict_values([100, 200])
res1:30
res2:300
>>>func(1,2,10,20,30,m=100,n=200,k=-100,g=-200)
<class 'dict'>
dict_keys(['m', 'n', 'k', 'g'])
dict_values([100, 200, -100, -200])
res1:60
res2:0
应用场景
一个很有用的应用场景(在一个函数外部调用另一个函数):
定义一个函数 func,实现某种性能(比方求两数之和)。而我的项目有特殊要求,须要对后果进行各种测验(类型测验,大小测验等等),须要对后果调用 check_data() 函数。如代码所示:
import check_data
def func(x,y,*args,**kwargs):
data=x+y
is_valid=check_data(*args,**kwargs)
if is_valid:
return data
else:
raise Exception('data is not valid')
这种时候,x 和 y 是关键字参数,次要用在函数外部进行相应性能的实现。而 args 和 *kwargs 则是不定参数,但这里专门用来传入 check_data 中。
这样做的益处:如果 check_data 外面有很多参数须要传递,大部分是应用默认值,这个时候如果在 func() 函数里都写进去会十分冗余,应用函数十分不清晰。通过这种形式,能够在应用时将参数重点放在关键字参数上,而若对 check_data 函数有非凡设置,再对有非凡设置的参数通过 args 和 *kwargs 传进去。灵便且简洁。
这种应用形式须要留神的是 args 或者 *kwargs 只用在一个函数或类上。用于多个极易混同出错。