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