文章目录
我们知道函数的参数可以有位置参数和关键字参数,它们的定义类似:
def fun(*a, **b)
其中*
和**
都涉及到解包的情况,就是把后面的变量a b
解析出来的步骤。
直接上代码:
def f(a, b, c, d):
print(a, b, c, d)
f(*[1, 2], **{'c': 3, 'd': 4})
x = [1, 2]
y = {'c': 3, 'd': 4}
f(*x, **y)
# f([1, 2, 3, 4])
def f1(*a, **b):
print(type(a), type(b))
# f(a, b)
f(*a, **b)
f1(1, 2, c=3, d=4)
代码中,注释的两行是会报错的两行,最后的打印结果是:
1 2 3 4
1 2 3 4
<class 'tuple'> <class 'dict'>
1 2 3 4
简单解释下,f1
函数中a
是一个元组,b
是一个字典,如果需要f1
里面需要调用f
,那么我们仍然需要对参数进行打包后发送出去,否则,像被注释掉的f(a, b)
这样调用,那么函数f
是只能获取到两个参数的,但是f
需要的是4个参数。
可以简单理解,如果参数里面看见了*a
,那么你可以认为a其实就是一个元组了,**b
,你可以认为b就是一个字典了。如果继续调用其它函数,你就需要知道别人需要什么参数。