- 前言
- 起因
- python函数定义
- 普通的参数列表
- 默认参数
- 参数列表中的`*args, **kwargs`
- 列表只有`*args`
- 列表只有`**kwargs`
- 列表中有`arg, *args, **kwargs`
- 函数调用中的**与*
本篇记录一下python函数的参数列表中,*
,**
的意义
python最强大的特性之一,就是琳琅满目的第三方库以及pip install xxx
超简单的安装包方法。
但是有的第三方库,提供的函数方法非常的“简洁”,比如matplotlib
包中,绝大部分函数的参数列表是**kwargs
,让人非常疑惑。
于是就有了本篇文章的内容:参数列表中的**kwargs
是啥?
首先从最简单的python函数定义开始,普通的参数列表长这样:
def func(a, b, c):
print(a, b, c)
func(1, 2, 4)
# 1 2 4
也就是说,传参顺序按照函数的参数列表顺序a, b, c
。
此外,可以指定传参时的接收参数:
def func(a, b, c):
print(a, b, c)
func(b=1, a=2, c=4)
# 2 1 4
还可以混合传参,不过混合传参时,带参数名的参数必须放在不带参数名的右边:
def func(a, b, c):
print(a, b, c)
func(1, c=2, b=4)
# 1 4 2
默认参数
函数的参数列表可以带默认参数,默认参数必须放在参数列表右边:
def func(a, b=2, c=4):
print(a, b, c)
func(1)
# 1 2 4
func(1, 3)
# 1 3 4
func(1, c=3)
# 1 2 3
参数列表中的*args, **kwargs
列表只有*args
考虑最简单的情况:
def func(*args):
print(args)
func(1, 2, 3)
# (1, 2, 3)
向*args
传递了三个值1, 2, 3
,args
得到的是(1, 2, 3)
这个元组。也就是说,函数参数列表中的*args
表示args
根据接收到的传参形成元组。
**kwargs
考虑最简单的情况:
def func(**kwargs):
print(kwargs)
func(a=1, b=2, c=3)
# {'a': 1, 'b': 2, 'c': 3}
向**kwargs
传递了a=1, b=2, c=3
三个带参数名的值,kwargs
得到的是{'a': 1, 'b': 2, 'c': 3}
这个字典。也就是说,函数列表中的**kwargs
根据接收到的带参数名的传参形成字典。
实际上这个kwargs
中的kw指的就是keyword
(也可以把kwargs换成其它的名字)
arg, *args, **kwargs
最后就是比较复杂的情况了,参数列表中同时有普通参数,带*, **
的参数:
def func(arg1, arg2, *args, **kwargs):
print(arg1, arg2, args, kwargs)
func(1, 2, 3, 4, a=5, b=6)
# 1 2 (3, 4) {'a': 5, 'b': 6}
可以看出程序运行时,先向普通参数arg1, arg2
传值1, 2
,再把不带参数名的传参值3, 4
向*args
传递,得到args=(3, 4)
,最后把带参数名的传参值a=5, b=6
向**kwargs
传递,得到kwargs={'a': 5, 'b': 6}
除了函数定义时参数列表中使用*args
,**kwargs
,还可以在调用时使用*
,**
解包参数,解包逻辑与函数定义是相同的:
def func(a, b, c):
print(a, b, c)
args = (1, 2, 3)
func(*args)
# 1 2 3
def func(a, b, c):
print(a, b, c)
kwargs = {'a': 1, 'b': 2, 'c': 3}
func(**kwargs)
# 1 2 3