函数的*args和**kwargs

Posted 千翻娃儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的*args和**kwargs相关的知识,希望对你有一定的参考价值。

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

以上是关于函数的*args和**kwargs的主要内容,如果未能解决你的问题,请参考以下文章

参数arg、*args、**kwargs三个的区别

了解装饰器函数中的作用域和 *args 和 **kwargs

python中*args和**kwargs学习

函数的*args和**kwargs

python编程系列---args与kwargs详解

*args和*kwargs