全部文章

*args 和 **kwargs

在 Python 中,*args 和 **kwargs 是用于处理函数参数的两种特殊语法,它们的核心区别在于处理参数的类型和方式。以下是详细对比:


1. *args(单星号)

    • 作用
      用于接收任意数量的位置参数(非关键字参数),并将这些参数打包成一个元组(tuple)

    • 使用场景
      当函数需要接受不确定数量的位置参数时。

    • 示例

def sum_numbers(*args):
    total = 0
    for num in args:
        total += num
    return total

print(sum_numbers(1, 2, 3))  # 输出 6
print(sum_numbers(4, 5))      # 输出 9
  • 关键点

    • 参数以元组形式存储(如 args = (1, 2, 3))。

    • 必须定义在普通参数之后(如 def func(a, b, *args))。

    • 调用时可以直接传递多个值(如 func(1, 2, 3, 4))。

2. **kwargs(双星号)

    • 作用
      用于接收任意数量的关键字参数(键值对参数),并将这些参数打包成一个字典(dict)

    • 使用场景
      当函数需要接受不确定数量的关键字参数时。

示例

def print_user_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_user_info(name="Alice", age=30, city="New York")
# 输出:
# name: Alice
# age: 30
# city: New York
  • 关键点

    • 参数以字典形式存储(如 kwargs = {"name": "Alice", "age": 30})。

    • 必须定义在 *args 之后(如 def func(a, *args, **kwargs))。

    • 调用时需以 key=value 形式传递参数(如 func(name="Bob", age=25))。


3. 核心区别总结

特性*args**kwargs
参数类型 位置参数(非关键字参数) 关键字参数(键值对参数)
存储形式 元组(tuple 字典(dict
调用方式 func(1, 2, 3) func(name="Alice", age=30)
顺序要求 必须定义在普通参数之后 必须定义在 *args 之后

4. 联合使用示例

*args 和 **kwargs 可以同时使用,以接受任意参数:

def func(a, b, *args, **kwargs):
    print(f"a={a}, b={b}")
    print(f"args={args} (类型: {type(args)})")
    print(f"kwargs={kwargs} (类型: {type(kwargs)})")

func(1, 2, 3, 4, x=5, y=6)
# 输出:
# a=1, b=2
# args=(3, 4) (类型: <class 'tuple'>)
# kwargs={'x': 5, 'y': 6} (类型: <class 'dict'>)

5. 参数解包(反向操作)

除了在函数定义中使用,* 和 ** 还可用于调用函数时解包参数:

解包列表/元组*

numbers = [1, 2, 3]
sum_numbers(*numbers)  # 等效于 sum_numbers(1, 2, 3)

解包字典**

params = {"name": "Bob", "age": 25}
print_user_info(**params)  # 等效于 print_user_info(name="Bob", age=25)

6. 注意事项

  • 命名约定
    args 和 kwargs 只是约定俗成的名称,实际可以用其他名字(如 *values 或 **options),但需保留 * 和 **

  • 参数顺序
    函数定义中参数的顺序必须为:普通参数 → *args → **kwargs(否则会报语法错误)。


7. 实际应用场景

  • *args 的用途
    实现可变参数的计算(如求平均值)、代理模式(将参数传递给其他函数)。

  • **kwargs 的用途
    处理配置参数、动态生成类的属性、扩展父类方法时保留参数灵活性。


总结*args 处理位置参数,**kwargs 处理关键字参数。它们让函数能灵活应对不确定数量的输入,是 Python 动态特性的重要体现。

posted @ 2025-03-16 17:45  指尖下的世界  阅读(51)  评论(0)    收藏  举报