普通函数的参数:
>> def func(words):
print(words)
>> func("a")
>> a
>> func("a","b")
>> TypeError: func() takes 1 positional argument but 2 were given
很明显,普通的函数参数定义后,函数参数的个数是固定的。而当我们想输入的参数个数多余或者少于定义的个数时,编译就会报错。那怎么解决呢?
这里就要用到可变参数*args 和 **kwargs。
如果我们不确定要往函数中传入多少个参数,或者我们想往函数中以列表和元组的形式传参数时,那就使要用*args;
如果我们不知道要往函数中传入多少个关键词参数,或者想传入字典的值作为关键词参数时,那就要使用**kwargs;
1.*args的使用方法
*args用来将参数打包成tuple(元组)给函数体调用
举个栗子:
>> def func2(*args):
>> print(args,type(args))
>>
>> func2("a")
>> ('aa',) <class 'tuple'>
>
>> func2(1,2,3)
>> (1, 2, 3) <class 'tuple'>
为了区分普通参数和*args参数的区别,再举一个栗子:
>>def func3(words,words2,*args):
print(words,words2,args)
>> func3(1,2,3,4,5)
>> 1 2 (3, 4, 5)
>> func3(1,2,3)
>> 1 2 (3,)
很明显,这里的(3,4,5)和(3,)都被打包成了tuple类型的数据。
2.**kwargs的使用方法
**kwargs 打包关键字参数成dict(字典)给函数体调用
举个栗子:
>> def func(**kwargs):
print(kwargs,type(kwargs))
>> func(a=1,b=2)
>> {'a': 1, 'b': 2} <class 'dict'>
这里,将a=1和b=2打包成了dict类型数据。
有了 *args和 **wrags这两个可变参数,我们就可以更加方便地定义函数参数,而不用考虑参数个数或者关键词个数了。
这里有一个点需要注意,当我们混合使用这三个参数时,必须遵循arg,*args,**kwargs这样的顺序,否则程序会报错。
>> def func(arg,*args,**kwargs):
>> print(arg,args,kwargs)
>> func(1,2,3,4,a=5)
>> 1 (2, 3, 4) {'a': 5}
错误排列:
>> def func(arg,**kwargs,*args):
>> print(arg,args,kwargs)
>> SyntaxError: invalid syntax