6.3.3 默认参数的传递
定义函数时可以指定形参的默认值,调用函数时可以选择是否给带有默认值的形参传值。若没有给带有默认值的形参传值,直接使用形参的默认值;若给带有默认值的形参传值,则使用实参的值覆盖默认值。
例如,定义一个用于连接设备的函数,在该函数中给一个参数指定默认值,对另一个参数不指定默认值,示例代码如下:
def connect(ip, port=8080):
print(f"设备{ip}:{port}连接!")
接下来调用两次 connect () 函数,分别使用默认值和不使用默认值,示例代码如下:
connect(ip="127.0.0.1")
connect(ip="127.0.0.1", port=3306)
以上代码中,第一次调用 connect () 函数时,"127.0.0.1" 会传递给与其关联的形参 ip,而形参 port 使用默认值 8080;第二次调用 connect () 函数时,"127.0.0.1" 会传递给与其关联的形参 ip,3306 会传递给与其关联的形参 port。
运行代码,结果如下所示:
设备 127.0.0.1:8080 连接!
设备 127.0.0.1:3306 连接!
6.3.4 参数的打包与解包
Python 支持将实参以打包和解包的形式传递给形参,这样可以在不事先知道参数数量的情况下进行函数调用或参数传递,使函数的调用和参数的传递更加方便和灵活。关于打包和解包的介绍如下。
1. 打包
Python 中参数的打包是指将多个实参打包成一个元组或字典,在函数调用时将其作为一个整体传递给形参。如果形参的前面加上 “*”,那么它可以接收以元组形式打包的多个值;如果形参的前面加上 “**”,那么它可以接收以字典形式打包的多个值。
定义一个形参为 * args 的函数,示例代码如下:
def test(*args):
print(args)
调用 test () 函数时传入多个实参,多个实参会以元组形式打包并传递给形参。示例代码如下:
test(11, 22, 33, 44, 55)
运行代码,结果如下所示:
(11, 22, 33, 44, 55)
由以上运行结果可知,Python 解释器将传给 test () 函数的所有值打包成元组后传递给了形参 * args。
定义一个形参为 **kwargs 的函数,示例代码如下:
def test(**kwargs):
print(kwargs)
调用 test () 函数时传入多个关联形参名的实参,示例代码如下:
test(a=11, b=22, c=33, d=44, e=55)
运行代码,结果如下所示:
{'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
由以上运行结果可知,Python 解释器将传给 test () 函数的所有实参打包成字典后传递给了形参 **kwargs。
值得一提的是,虽然函数中添加 “ ” 或 “**” 的形参名可以是符合命名规则的任意名称,但建议使用args 和kwargs。若函数没有接收到任何数据,参数 * args 和kwargs 为空,即它们分别为空元组和空字典。
2. 解包
Python 中参数的解包是指使用特殊语法将元组或字典拆分为多个值并赋给对应的形参。如果函数在调用时接收的实参是元组类型的数据,那么可以使用 “*” 将元组拆分成多个值,并按照位置参数的传递方式赋给对应的形参;如果函数在调用时接收的实参是字典类型的数据,那么可以使用 “**” 将字典拆分成多个键值对,并按照关键字参数的传递方式赋给与键名称对应的形参。
定义一个带有 5 个形参的函数,示例代码如下:
def test(a, b, c, d, e):
print(a, b, c, d, e)
调用 test () 函数时传入一个包含 5 个元素的元组,并使用 “*” 对该元组执行解包操作,示例代码如下:
nums = (11, 22, 33, 44, 55)
test(*nums)
运行代码,结果如下所示:
11 22 33 44 55
由以上运行结果可知,元组被解包成多个值。
调用 test () 函数时传入一个包含 5 个元素的字典,并使用 “**” 对该字典执行解包操作,示例代码如下:
nums = {"a":11, "b":22, "c":33, "d":44, "e":55}
test(**nums)
运行代码,结果如下所示:
11 22 33 44 55
由以上运行结果可知,字典被解包成多个值。