6.3.5 混合传递
前面介绍的参数传递的方式在定义或调用函数时可以混合使用,但是需要遵循一定的优先级规则。函数参数的传递方式按优先级从高到低依次为位置参数的传递、关键字参数的传递、默认参数的传递、打包传递。
在定义函数时,带有默认值的参数必须在普通参数(不带有默认值或星号标识的参数)之后,带有**标识的参数必须在带有*标识的参数之后。
例如,定义一个有多种形参的函数,代码如下:
def test(a, b, c=33, *args, **kwargs):
print(a, b, c, args, kwargs)
调用 test () 函数,依次传入不同个数和形式的参数,示例代码如下:
test(1, 2)
test(1, 2, 3)
test(1, 2, 3, 4)
test(1, 2, 3, 4, e=5)
运行代码,结果如下所示:
1 2 33 () {}
1 2 3 () {}
1 2 3 (4,) {}
1 2 3 (4,) {'e': 5}
**test () 函数共有 5 个参数,以上代码多次调用 test () 函数并传入不同个数和形式的参数,下面结合代码运行结果逐个说明函数调用过程中参数的传递情况。
- 第一次调用 test () 函数时,该函数接收到实参 1、2,这两个实参分别被位置参数 a 和 b 接收;剩余 3 个形参 c、*args、**kwargs 没有接收到实参,都使用默认值,因此最后 3 个参数对应的输出的结果为 33、() 和 {}。
- 第二次调用 test () 函数时,该函数接收到实参 1、2、3,前 3 个实参分别被位置参数 a、b、c 接收;剩余两个形参 * args、**kwargs 没有接收到实参,都使用默认值,因此最后两个参数对应的输出的结果为 () 和 {}。
- 第三次调用 test () 函数时,该函数接收到实参 1、2、3、4,前 4 个实参分别被形参 a、b、c、*args 接收;形参 **kwargs 没有接收到实参,因此最后一个参数对应的输出的结果为 {}。
- 第四次调用 test () 函数时,该函数接收到实参 1、2、3、4 和关联形参 c 的实参 5,所有的实参被相应的形参接收。**