跳转至

Args & kwargs 函数可变长参数对比

在Python中,*args**kwargs是用于处理函数可变长参数的两种机制,用来允许函数接受可变数量的参数。


1. *args

作用

  1. 收集 位置参数(Positional Arg ument s),将多余的位置参数打包成**元组**。

  2. 接受列表、元组解包的结果(*ls),自动作为*位置参数*。

语法:在参数名前加一个星号 *(如 *args,但名称可以自定义)。

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

示例

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

  print(sum_numbers(1, 2, 3))  # 输出 6

  ls = [1, 2, 3]
  print(sum_numbers(*ls))  # 输出 6

2. **kwargs

作用

  1. 收集**关键字参数**(K ey w ord Arg ument s),将多余的关键字参数转成键值对打包成 字典(键为参数名,值为参数值)。

  2. 接受字典解包的结果(**dict),自动作为 关键字参数注意:字典中参数的关键字要用 字符串 存储!

语法:在参数名前加两个星号 **(如 **info,名称可自定义)。

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

示例

def studentInfo(name, age, **more_info):  
    print(f"Name: {name}\nAge: {age}")  
    for key, value in more_info.items():  
        print(f"{key}: {value}")

studentInfo(name="Harold", age=25, city="New York", major="AI")
print()

# 字典中参数的关键字要用字符串存储
info = {"age": 22, "city": "Los Angeles", "major": "Data Science"}
studentInfo(name="Alice", **info)

输出:

1
2
3
4
5
6
7
8
9
Name: Harold
Age: 25
city: New York
major: AI

Name: Alice
Age: 22
city: Los Angeles
major: Data Science

3. 组合使用

在函数定义中,它们可以同时存在,但必须遵循顺序:普通参数 → *args**kwargs

def example(a, b, *args, **kwargs):
    print(f"a={a}, b={b}")
    print(f"args={args}")
    print(f"kwargs={kwargs}")

example(1, 2, 3, 4, name="Alice", age=30)
# 输出:
# a=1, b=2
# args=(3, 4)
# kwargs={'name': 'Alice', 'age': 30}

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

*** 也可用于调用函数时解包序列或字典:

* 解包序列为位置参数:

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

** 解包字典为关键字参数:

  info = {"name": "Alice", "age": 25}
  print_info(**info)  # 等价于 print_info(name="Alice", age=25)

5. 对比 *args**kwargs

特性 *args **kwargs
参数类型 位置参数 关键字参数
数据结构 元组(Tuple) 字典(Dictionary)
参数顺序 必须在普通位置参数之后、**kwargs 必须在所有参数之后
解包与打包 函数调用时用*解包列表/元组 函数调用时用**解包字典
典型用途 接受可变数量的位置参数 接受可变数量的关键字参数

6. 其他关键点

  • 命名约定:名称不一定是 argskwargs,但这是约定俗成的命名方式。

  • 函数调用时的解包:注意!对于 *args 形参,即使只传一个实参也会打包成 元组**kwargs 同理。

def sum(*args): 
    sum = 0  
    for i in args:  
        sum += i  
    return sum
nums = [1, 2, 3]  
print(sum(*nums))  # 被解释为 sum(1, 2, 3)
# print(sum(nums))  # 被解释为 sum([1, 2, 3]), sum函数求和时出错

info = {"name": "Bob", "age": 25}
example(**info)  # 被解释为 example(name="Bob", age=25)
- 仅关键字参数:在 *args 后的参数必须通过关键字传递(Python 3特性):

1
2
3
def func(a, *args, b):
    pass
func(1, 2, 3, b=4)  # b必须显式指定

总结

*args:处理不确定数量的位置参数,灵活扩展函数。

**kwargs:处理不确定数量的关键字参数,适合配置项或可选参数。

• 两者结合使用能极大提升函数的通用性,常见于装饰器、继承等方法中。