在阅读 Python 代码的过程中,不时会看到 *args 和 **kwargs ,它们究竟表示什么?又该如何使用呢?
首先要明确,这里的 * 并不是乘法运算符也不是序列重复操作符,**也不是指数运算符也不是幂运算符。
- * 出现在列表变量前时,表示将列表元素解包,可将列表元素分配给多个变量;
- ** 出现在字典变量前时,表示将字典解包,可将字典中的键值对生成以键名称为变量名称的变量值对;
它们的名称中都包含字符 "args",表示它们都与函数参数传递相关。
我们先来看一下 Python 函数参数传递方法。
在定义 Python 函数时,通常情况下参数数量和参数类型和名称都是确定的。参数可分为位置参数和命名参数。
位置参数:参数的含义和参数的位置密切相关。比如在下面的网络连接函数定义中,第一个参数表示要连接的目标主机名称,第二个参数表示目标端口,第三个参数表示用户名称,第四个参数表示用户密码。
def net_connect(host, port, user, pass):
用户在调用上面的函数时,必须按照上面定义的顺序传入相应的参数,否则就会导致错误。
net_connect('login.example.com', 8888, 'guest', 'guest')
命名参数:参数有名称,传递参数值时需要指定参数的名称。
将上面示例中的函数按命名参数,可重新定义如下:
def net_connect(host='localhost', port=8888, user='guest', pass='guest')
通过命名参数,可以设定参数的默认值,即在调用函数时,如果没有显式指定参数,则使用默认值。 下面的调用方式都是等价的。
net_connect()
net_connect(host='localhost')
net_connect(port=8888)
net_connect(user='guest')
net_connect(pass='guest')
使用命名参数后,参数位置可以互换。下面的调用方式都是等价的。
net_connect(port=80, pass='guest', user='guest', host='localhost')
net_connect(pass='guest', user='guest', host='localhost', port=80)
net_connect(user='guest', pass='guest', host='localhost', port=80)
net_connect(user='guest', host='localhost', pass='guest', port=80)
位置参数和命名参数可以同时出现,但位置参数必须在所有命名参数左侧。
上面的示例函数改写如下:
def net_connect(host, port, user='guest', pass='guest')
讲了这么多,那 *args 和 **kwargs 又该如何使用呢?
在调用函数时,可以通过对列表解包和字典解包来传递参数。
target = ['localhost', 8888]
credential = {'user':'guest', 'pass':guest'}
net_connect(*target, **credentail)
特别是参数数量会根据实际情况变动时,我们可以根据条件构造字典项,然后在调用函数时将字典解包即可,这样就可以避免复杂的条件判断给函数传递不同的参数。
在对已有函数进行封装时,通常利用 *args 和 **kwargs 向目标函数传递参数。
def target_func(....):
...
def my_func(arg1, arg2, arg3, *args, **kwargs) :
...
target_func(*args, **kwargs)
如果函数定义时使用了列表解包或字典解包,我们可以分别通过 list 和 dict 来遍历参数。
def func_name(*args, **kwargs):
for item in args:
...
for k, v in kwargs.items():
...
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/107238.html