Python 语言 - 函数的可变参数

在 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)
上一篇:openwrt部分文件解析


下一篇:invokeBeanFactoryPostProcessors