← 返回首页
1.
2.
Python 中的 *args 和 **kwargs 表示什么?
在 Python 中,*args 和 **kwargs 是用于处理可变数量参数的特殊语法。它们允许函数接收不确定数量的参数,极大地增强了函数的灵活性。
1. *args:接收任意数量的位置参数
*args 允许你将多余的位置参数打包成一个元组(tuple)。
- 命名约定:虽然通常写成
args,但*后面的名字是任意的(如*a,*my_params都可以),但 Python 社区约定俗成使用*args。
def my_func(*args):
print(type(args)) # <class 'tuple'>
for arg in args:
print(arg)
my_func(1, 2, 3)
输出:
<class 'tuple'>
1
2
3
2. **kwargs:接收任意数量的关键字参数
**kwargs 允许你将多余的关键字参数打包成一个字典(dict)。
- 命名约定:同样,
**后面的名字也是任意的,但社区约定俗成使用kwargs(keyword arguments)。
def my_func(**kwargs):
print(type(kwargs)) # <class 'dict'>
for key, value in kwargs.items():
print(f"{key}: {value}")
my_func(name="Alice", age=25)
输出:
<class 'dict'>
name: Alice
age: 25
3. 组合使用与参数顺序
在实际开发中,它们经常和普通参数一起使用。Python 对参数的定义顺序有严格规定: 普通参数 -> *args -> 关键字参数 -> **kwargs
def complex_func(a, b, *args, key1="default", **kwargs):
print(f"a={a}, b={b}")
print(f"args={args}")
print(f"key1={key1}")
print(f"kwargs={kwargs}")
complex_func(1, 2, 3, 4, key1="custom", x=10, y=20)
输出:
a=1, b=2
args=(3, 4)
key1=custom
kwargs={'x': 10, 'y': 20}
4. 解包操作(Unpacking)
除了用于函数定义,* 和 ** 在函数调用时也可以用来“解包”元组或字典,将其转换为位置参数或关键字参数传入:
def add(a, b, c):
return a + b + c
解包列表作为位置参数
my_list = [1, 2, 3]
print(add(*my_list)) # 等价于 add(1, 2, 3),输出 6
解包字典作为关键字参数
my_dict = {"a": 10, "b": 20, "c": 30}
print(add(**my_dict)) # 等价于 add(a=10, b=20, c=30),输出 60
总结:*args 是位置参数的打包/解包器(元组),**kwargs 是关键字参数的打包/解包器(字典)。它们是 Python 实现装饰器、高阶函数和灵活 API 设计的重要基石。