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:函数内是字典,用于「任意多个关键字参数」。- 调用时的
*/**表示解包,与定义时的打包相对应。