1、*args
和**kwargs
这两个是python中方法的可变参数。
2、*args
表示任何多个无名参数,它是一个tuple。
3、**kwargs
表示关键字参数,它是一个dict。并且同时使用*args
和**kwargs
时,必须*args
参数列要在**kwargs
参数前。
在自定义函数时,如果参数名前加上一个星号“*”,即*args
,则表示该参数是一个可变长参数。在调用该函数时,如果依次序将所有的其他变量都赋值之后,剩下的参数将会收集在一个元组中,元组的名称就是前面带星号的参数名。
只有一个带星号的参数的函数实例
def demo(*args):
print(type(args))
print(args)
demo(1)
demo(1,2,3)
# result
"""
(1,)
(1, 2, 3)
"""
一般来说带星号的参数应放在后面,当带星号的参数放在最前面时,仍然可以正常工作,但调用时后面的参数必须以关键字参数方式提供,否则因其后的位置参数无法获取值而引发错误。
同时有三种类型的参数的函数定义及调用
def demo(*args, a, b=0):
print('args:', args)
print('a:', a)
print('b:', b)
demo(1,2,3,a=5)
demo(1,2,3,a=5,b=5)
demo(1,2,3) # 这行代码调用会出错,a变量没有默认值,也不能获取值
# result
"""
args: (1, 2, 3)
a: 5
b: 0
args: (1, 2, 3)
a: 5
b: 5
TypeError: demo() missing 1 required keyword-only argument: 'a'
使用元组来收集参数的参数时,调用时提供的参数不能为关键字参数,如果要收集不定数量的关键字参数可以在自定义函数时的参数前面加两颗星即**kwargs
,这样一来,多余的关键字参数就可以以再点的方式被收集到变量kwargs之中。
注意:收集关键字参数是要放在函数声明的参数列表中的所有参数之后。
一个定义了收集关键字参数的实例
def demo(a, b=0, **kwargs):
"""
最后一个参数前有两颗星号,即为收集关键字参数到字典中
"""
print('kwargs:', kwargs)
print('a:', a)
print('b:', b)
demo(1,c=5,b=2,d=3)
# result
"""
kwargs: {'c': 5, 'd': 3}
a: 1
b: 2
"""