
Python 中的 *args 和 **kwargs 是处理可变数量参数的核心机制,它们让函数更灵活、复用性更强,尤其在写装饰器、封装接口或适配不同调用场景时非常实用。
什么是 *args:接收任意多个位置参数
*args 允许函数接受不确定个数的**位置参数**(即不带关键字的参数),这些参数在函数内部自动打包成一个 tuple。星号 * 是关键符号,args 只是约定俗成的名字,你也可以写成 *rest 或 *xs,但强烈建议用 args 保持可读性。
使用示例:
def add(*args):
return sum(args)
<p>print(add(1, 2)) # 输出:3
print(add(1, 2, 3, 4)) # 输出:10
print(add()) # 输出:0(空 tuple 的 sum 是 0)
注意:*args 必须放在函数参数列表的**最后位置参数之后、****kwargs** 之前**。它不能出现在默认参数后面,否则会报错。
立即学习“Python免费学习笔记(深入)”;
什么是 **kwargs:接收任意多个关键字参数
**kwargs 用于接收任意数量的**关键字参数**(即形如 key=value 的参数),这些参数在函数内自动组织成一个 dict。双星号 ** 表示“解包为字典”,kwargs 同样是惯例名,不强制但推荐。
使用示例:
def greet(**kwargs):
for name, msg in kwargs.items():
print(f"{name}: {msg}")
<p>greet(Alice="Hi!", Bob="Hello", Charlie="Hey~")</p><h1>输出:</h1><h1>Alice: Hi!</h1><h1>Bob: Hello</h1><h1>Charlie: Hey~</h1><p>**kwargs 必须是参数列表中的**最后一个参数**,且不能和同名的普通参数冲突。比如不能同时定义 name 参数和用 **kwargs 传入 name=...(除非函数内做了覆盖处理)。
如何组合使用:标准参数 + *args + **kwargs
三者可以共存,顺序固定:**普通参数 → *args → **kwargs**。这是 Python 的语法硬性要求。
典型结构如下:
def example(a, b, *args, **kwargs):
print("必需参数 a, b:", a, b)
print("额外位置参数 args:", args)
print("额外关键字参数 kwargs:", kwargs)
<p>example(1, 2, 3, 4, 5, x=10, y=20)</p><h1>输出:</h1><h1>必需参数 a, b: 1 2</h1><h1>额外位置参数 args: (3, 4, 5)</h1><h1>额外关键字参数 kwargs: {'x': 10, 'y': 20}</h1><p>- 普通参数(如
a,b)必须传,且按位置或关键字提供 -
*args捕获所有“多出来的”位置参数 -
**kwargs捕获所有“多出来的”关键字参数 - 调用时,位置参数必须在关键字参数之前(Python 原则)
实际应用小技巧
除了定义函数,* 和 ** 还常用于**实参解包**,这是和定义时对称的重要能力:
- 用
*list把列表/元组“打散”成位置参数:func(*[1,2,3])等价于func(1,2,3) - 用
**dict把字典“打散”成关键字参数:func(**{'a':1,'b':2})等价于func(a=1,b=2) - 装饰器中几乎必用:
def wrapper(*args, **kwargs): return func(*args, **kwargs),确保被装饰函数能接收任何调用方式 - 子类构造器中转发父类参数:
super().__init__(*args, **kwargs),避免重复写参数列表
掌握这组机制,你就掌握了 Python 函数签名设计的弹性核心。不复杂但容易忽略细节,多写几次就成直觉了。










