跳转到主内容
极星编程网:以代码为星,赴技术山海!

Python可变参数怎么用_args与kwargs详解

Python 中的
*args
和
**kwargs
是处理可变数量参数的核心机制,它们让函数更灵活、复用性更强,尤其在写装饰器、封装接口或适配不同调用场景时非常实用。 什么是 *args:接收任意多个位置参数
*args
允许函数接受不确定个数的**位置参数**(即不带关键字的参数),这些参数在函数内部自动打包成一个 tuple 。星号
*
是关键符号,
args
只是约定俗成的名字,你也可以写成
*rest
或
*xs
,但强烈建议用
args
保持可读性。 使用示例:
def 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
** 之前**。它不能出现在默认参数后面,否则会报错。 立即学习 “ Python免费学习笔记(深入) ”; 什么是 **kwargs:接收任意多个关键字参数
**kwargs
用于接收任意数量的**关键字参数**(即形如
key=value
的参数),这些参数在函数内自动组织成一个 dict 。双星号
**
表示“解包为字典”,
kwargs
同样是惯例名,不强制但推荐。 使用示例:
def 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~

**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)

example(1, 2, 3, 4, 5, x=10, y=20)

输出:

必需参数 a, b: 1 2

额外位置参数 args: (3, 4, 5)

额外关键字参数 kwargs: {'x': 10, 'y': 20}

普通参数(如
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 函数签名设计的弹性核心。不复杂但容易忽略细节,多写几次就成直觉了。

相关文章