python中*args, **kwargs到底是什么意思
*args (可变位置参数)
*args
用于收集任意数量的位置参数。当你在函数定义中使用 *args
时,它会将所有传递给函数的额外位置参数收集到一个**元组(tuple)**中。
工作原理:
- *运算符:这里的星号 (
*
) 是一个解包(unpacking)操作符。 - args:
args
只是一个约定俗成的名称,你可以用任何其他合法的变量名替代(例如*numbers
,*items
),但args
是最常见的用法。
什么情况下使用 *args?
- 当你不知道函数会被传递多少个位置参数时。
- 当你需要编写一个可以接受不同数量输入的通用函数时(例如一个求和函数,可以对任意数量的数字求和)。
**kwargs (可变关键字参数)
**kwargs
用于收集任意数量的关键字参数。当你在函数定义中使用 **kwargs
时,它会将所有传递给函数的额外关键字参数收集到一个**字典(dictionary)**中。字典的键是参数名,值是参数值。
工作原理:
- ** 运算符: 这里的双星号 (
**
) 也是一个解包操作符,专门用于字典。 - kwargs:
kwargs
也是一个约定俗成的名称,代表 “keyword arguments”(关键字参数),你可以用其他合法变量名替代,但kwargs
是最常见的用法。
什么情况下使用 **kwargs?
- 当你需要一个函数能够处理不确定数量的配置选项或命名参数时。
- 当你编写一个需要灵活接收各种属性的API或框架时(例如,一个创建HTML元素的函数,可以接受任意的HTML属性)。
其实上面讲了那么多,具体看着一份代码就能很清晰的了解:
def complex_function(a, b, *args, p1="default", **kwargs):print(f"a: {a}")print(f"b: {b}")print(f"args: {args}")print(f"p1: {p1}")print(f"kwargs: {kwargs}")complex_function(10, 20, 30, 40, x=100, y="test", p1="custom_value", status="active")
# 输出:
# a: 10
# b: 20
# args: (30, 40)
# p1: custom_value
# kwargs: {'x': 100, 'y': 'test', 'status': 'active'}complex_function(1, 2, "hello", p1="changed")
# 输出:
# a: 1
# b: 2
# args: ('hello',)
# p1: changed
# kwargs: {}