在 Python 的代码中,经常可以看到函数的参数中有 *args 和 **kwargs 这样的参数。这是 Python 可变参数(也经常被称作不定长参数) 的语法。本文介绍可变参数的作用和用法。
在定义函数的时候,经常碰到参数个数不确定的情况,比如,我们需要把若干个整数进行合计,如果没有可变参数的机制,需要传比如 List 数据类型作为参数。
def add(int_list):
rv = 0
for item in int_list:
rv += item
return rv
# 调用 add 函数
numbers = [1,2,3,4,5]
print(add(numbers))
Python 函数中,如果参数前有一个 * 号,表示任意数量的位置参数,有了这个语法,刚才的 add 函数定义和调用就变成了这样:
def add(*args):
rv = 0
for item in args:
rv += item
return rv
# 调用add函数
print(add(1,2,3,4,5))
在函数内部,参数 args 被封装为 tuple 类型。Python 的星号还提供了将 list 或 tuple 打散的机制,让我们使用起来更加灵活。比如刚刚才的 add() 函数的参数是可变长度参数,如果我们有从 1 到 100 一共一百个数,这个时候怎么调用呢? 利用 * 机制:
numbers = range(1,101)
print(add(*numbers))
如果参数前有两个 * 号,则表示任意数量的关键字参数。关键字参数提供了代码更好的可读性。假设需要编写一个函数,从配置数据中获取信息。read_conf() 函数如下:
def read_conf(confid, **kwargs):
username = kwargs.get("username")
password = kwargs.get("password")
print(username, password)
调用的方法如下:
read_conf('db1', ip='xxx', port='xxx', username='sam', password='sampassword')
从调用的关键字来看,很容易看出函数的意图。在函数内部 kwargs 被组装为一个 dict。在声明为 **kwargs 的地方,如果已经有一个 dict,可以通过 **dict 将参数打散为多个关键字参数 ( **kwargs
定义参数,**dict
的方式调用)
conf = {
'ip':'xxx',
'port':'xxx',
'username':'sam',
'password':'sampassword'
}
read_conf('db1', **conf)