Skip to content

Python 中的 *args**kwargs

函数定义里,*args 把多出来的位置参数收进一个元组**kwargs 把多出来的关键字参数收进一个字典。名字习惯写成 args / kwargs,只有前面的 * / ** 是语法;你也可以写成 *items**options 等。

函数调用里,* 用来把可迭代对象解包成多个位置实参;** 用来把字典解包成多个关键字实参。与 函数 一节配合阅读更顺。

定义函数:*args(可变位置参数)

python
def find_average(*args):
    total = 0
    print("打包后的元组 ->", args)
    for i in args:
        total += i
    return total / len(args)


print("平均值 ->", find_average(1, 2, 3, 4, 5))

输出:

text
打包后的元组 -> (1, 2, 3, 4, 5)
平均值 -> 3.0

*args 在函数体内就是元组(空调用时为空元组)。

调用时解包:*iterable

python
a = [1, 2, 3]
print(*a)

输出:

text
1 2 3

等价于 print(1, 2, 3)。把列表/元组/生成器等拆开传给需要多个位置参数的函数时很有用。

定义 + 调用配合

python
def compute_maximum(*args):
    if not args:
        raise ValueError("至少传入一个数")
    return max(args)


nums = [4, 5, 10, 14, 3]
print("最大值 ->", compute_maximum(*nums))

输出:

text
最大值 -> 14

这里用 max 实现,避免手写循环在全为负数时仍以 0 为初值而出错。

定义函数:**kwargs(可变关键字参数)

python
def find_average(**kwargs):
    print("关键字参数字典 ->", kwargs)
    total = sum(kwargs.values())
    return total / len(kwargs)


print("平均值 ->", find_average(first=1, second=2, third=3, fourth=4, fifth=5))

输出:

text
关键字参数字典 -> {'first': 1, 'second': 2, 'third': 3, 'fourth': 4, 'fifth': 5}
平均值 -> 3.0

求元素个数用 len(kwargs) 即可;len(kwargs.items()) 数值相同,但一般不这么写。

调用时解包:**mapping

字典展开成关键字参数传给函数:

python
def greet(name, age):
    print(f"{name}{age} 岁")


data = {"name": "Lee", "age": 30}
greet(**data)

输出:

text
Lee,30 岁

字典的必须是合法参数名;多余或缺失键会报错。

*** 小结

位置***
定义多余位置参数 → 元组多余关键字参数 → 字典
调用可迭代对象 → 多个位置实参映射对象 → 多个关键字实参

参数顺序(简记)

在 Python 3 中,常见顺序为:

一般参数*args(若有)仅限关键字参数(若有)**kwargs(若有)

更细的 /(仅位置)* 单独出现 等规则见官方教程与 PEP。

小结

  • *args:函数内是元组,用于「任意多个位置参数」。
  • **kwargs:函数内是字典,用于「任意多个关键字参数」。
  • 调用时的 * / ** 表示解包,与定义时的打包相对应。

参考