*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:30res2: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:60res2:0

应用场景

一个很有用的应用场景(在一个函数外部调用另一个函数):

定义一个函数func,实现某种性能(比方求两数之和)。而我的项目有特殊要求,须要对后果进行各种测验(类型测验,大小测验等等),须要对后果调用check_data()函数。如代码所示:

import check_datadef 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只用在一个函数或类上。用于多个极易混同出错。