python: *args 与 **kwargs 用法
在 Python 中,*args
和 **kwargs
是用于处理函数参数的灵活工具,它们允许函数接受可变数量的参数。以下是它们的详细用法和区别:
1. *args
:处理可变数量的位置参数
作用:
-
将多个位置参数打包成一个元组。
-
允许函数接收比定义时更多的位置参数。
语法示例:
python
复制
下载
def func(a, b, *args):print("固定参数:", a, b)print("可变参数:", args)func(1, 2, 3, 4, 5)
输出:
复制
下载
固定参数: 1 2
可变参数: (3, 4, 5)
特点:
-
args
是约定名称(可自定义,如*numbers
)。 -
必须出现在普通参数之后。
-
可与默认参数结合使用:
python
复制
下载
def func(a, b=10, *args):print(a, b, args)
- 在函数内部,可以通过遍历args元组来访问每个参数。例如:
python
for arg in args:print(arg)
2. **kwargs
:处理可变数量的关键字参数
作用:
-
将多个关键字参数打包成一个字典。
-
允许函数接收未预先定义名称的关键字参数。
语法示例:
python
复制
下载
def func(a, b, **kwargs):print("固定参数:", a, b)print("关键字参数:", kwargs)func(1, 2, name="Alice", age=25)
输出:
复制
下载
固定参数: 1 2
关键字参数: {'name': 'Alice', 'age': 25}
特点:
-
kwargs
是约定名称(可自定义,如**options
)。 -
必须出现在所有参数之后(包括
*args
)。 -
可与其他参数组合:
python
复制
下载
def func(a, *args, **kwargs):print(a, args, kwargs)
- 函数内部,可以通过遍历
kwargs
字典来处理每个关键字参数
python
for key, value in kwargs.items():print(f"{key}:{value}")
3. 参数顺序规则
Python 对函数参数顺序有严格规定,必须按以下顺序排列:
python
复制
下载
def func(a, b=默认值, *args, c, d=默认值, **kwargs):pass
正确顺序:
-
普通位置参数
-
默认参数
-
*args
-
仅限关键字参数(
c
) -
默认关键字参数(
d=默认值
) -
**kwargs
4. 解包参数的用法
*
和 **
也可用于调用函数时解包参数:
示例 1:解包列表/元组
python
复制
下载
def func(a, b, c):print(a, b, c)numbers = [1, 2, 3]
func(*numbers) # 等价于 func(1, 2, 3)
示例 2:解包字典
python
复制
下载
def func(name, age):print(name, age)data = {"name": "Bob", "age": 30}
func(**data) # 等价于 func(name="Bob", age=30)
5. 实际应用场景
场景 1:继承中的方法重写
python
复制
下载
class Parent:def show(self, a, b):print(a, b)class Child(Parent):def show(self, *args, **kwargs):super().show(*args, **kwargs) # 透传所有参数print("额外逻辑")
场景 2:装饰器
python
复制
下载
def logger(func):def wrapper(*args, **kwargs):print("函数被调用")return func(*args, **kwargs)return wrapper@logger
def add(a, b):return a + b
场景 3:通用数据处理
python
复制
下载
def process_data(*args, **kwargs):print("位置参数:", args)print("关键字参数:", kwargs)process_data(1, 2, 3, city="Beijing", country="China")
6. 常见错误
错误 1:顺序错误
python
复制
下载
def func(**kwargs, *args): # 语法错误pass
错误 2:重复参数名
python
复制
下载
def func(a, **kwargs):passfunc(a=1, a=2) # 重复关键字参数
7. 扩展知识(Python 3.5+)
PEP 448 允许在更多场景中使用解包:
python
复制
下载
# 合并字典
dict1 = {"a": 1}
dict2 = {"b": 2}
combined = {**dict1, **dict2} # {'a':1, 'b':2}# 合并列表
list1 = [1, 2]
list2 = [3, 4]
merged = [*list1, *list2] # [1, 2, 3, 4]
总结
特性 | *args | **kwargs |
---|---|---|
参数类型 | 位置参数 | 关键字参数 |
打包为 | 元组 | 字典 |
解包对象 | 列表/元组 | 字典 |
典型应用 | 可变数量输入 | 动态配置选项 |
语法位置 | 普通参数之后 | 所有参数最后 |
掌握 *args
和 **kwargs
能显著提升代码的灵活性和可扩展性!