一文弄懂Python中的*args 和 **kwargs

大哥们在线教一下,一文弄懂Python中的*args 和 **kwargs
最新回答
守望

2026-10-30 15:36:03

在Python中,*args和kwargs是用于处理可变数量参数的机制,它们分别用于处理位置参数和关键字参数。以下是对它们的详细解释和示例:

1. *args:处理可变数量的位置参数

*args允许函数接受任意数量的位置参数。这些参数在函数内部被打包成一个元组。

示例:def add(*args): print(args, type(args)) total = 0 for num in args: total += num return totalprint(add(2, 3)) # 输出: (2, 3) <class 'tuple'>print(add(2, 3, 5)) # 输出: (2, 3, 5) <class 'tuple'>print(add(2, 3, 5, 7)) # 输出: (2, 3, 5, 7) <class 'tuple'>说明:
  • *args将传入的位置参数打包成一个元组。
  • 参数名args是约定俗成的,但你可以使用任何名称,如*numbers。
2. kwargs:处理可变数量的关键字参数

kwargs允许函数接受任意数量的关键字参数。这些参数在函数内部被打包成一个字典。

示例:def total_fruits(kwargs): print(kwargs, type(kwargs)) total = 0 for amount in kwargs.values(): total += amount return totalprint(total_fruits(banana=5, mango=7, apple=8)) # 输出: {'banana': 5, 'mango': 7, 'apple': 8} <class 'dict'>print(total_fruits(banana=5, mango=7, apple=8, oranges=10)) # 输出: {'banana': 5, 'mango': 7, 'apple': 8, 'oranges': 10} <class 'dict'>说明:
  • kwargs将传入的关键字参数打包成一个字典。
  • 参数名kwargs是约定俗成的,但你可以使用任何名称,如fruits。
3. 组合使用*args和kwargs

你可以在同一个函数中同时使用*args和kwargs,以处理任意数量的位置参数和关键字参数。

示例:def example_function(arg1, *args, kwargs): print("固定参数:", arg1) print("位置参数:", args) print("关键字参数:", kwargs)example_function(1, 2, 3, 4, name="Alice", age=25)输出:固定参数: 1位置参数: (2, 3, 4)关键字参数: {'name': 'Alice', 'age': 25}说明:
  • arg1是一个固定参数。
  • *args收集额外的位置参数。
  • kwargs收集额外的关键字参数。
4. 实际应用场景

*args和kwargs常用于以下场景:

  • 函数装饰器:处理被装饰函数的参数。
  • 继承和多态:在子类中扩展父类的方法,接受额外的参数。
  • 通用函数:编写可以处理多种输入的函数。
示例:装饰器def logger(func): def wrapper(*args, kwargs): print(f"调用函数: {func.__name__}") print(f"位置参数: {args}") print(f"关键字参数: {kwargs}") return func(*args, kwargs) return wrapper@loggerdef greet(name, greeting="Hello"): print(f"{greeting}, {name}!")greet("Alice", greeting="Hi")输出:调用函数: greet位置参数: ('Alice',)关键字参数: {'greeting': 'Hi'}Hi, Alice!5. 注意事项
  • 参数顺序:在函数定义中,*args必须出现在kwargs之前。def valid_function(a, *args, kwargs): # 正确 passdef invalid_function(a, kwargs, *args): # 错误 pass
  • 解包参数:*和也可以用于解包参数。def func(a, b, c): print(a, b, c)args = (1, 2, 3)func(*args) # 解包元组kwargs = {'a': 1, 'b': 2, 'c': 3}func(kwargs) # 解包字典
总结
  • *args用于处理可变数量的位置参数,打包成元组。
  • kwargs用于处理可变数量的关键字参数,打包成字典。
  • 两者可以组合使用,增强函数的灵活性。
  • 常用于装饰器、继承和多态、通用函数等场景。
  • 注意参数顺序和解包用法。

通过合理使用*args和kwargs,你可以编写更加灵活和可扩展的Python函数。