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

3次阅读

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

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

text=ZqhQzanResources