*args 和 **kwargs 是 Python 函数定义中用于处理可变数量的参数的语法,初学者对于二者总是傻傻区分不了,今天我们就来详细解读一下这两个在参数传递时有什么不同。
首先要明白单个星号可以解包元组或者列表,两个星号可以解包字典。如:
print(*[1,3,4,5]) 和print(**{"张三":25, "李四":36, "王五":48}) 可以分别把列表和字典包含的元素打印出来。
一、*args 在Python中是什么意思?
- *args 用于传递任意数量的非关键字参数给函数。
- 在函数内部,*args 被作为一个元组对待。
示例:
def test_args_kwargs(arg1, arg2, arg3):
print(f"arg1: {arg1}")
print(f"arg2: {arg2}")
print(f"arg3: {arg3}")
args = ("two", 3, 5)
test_args_kwargs(*args) #用*args来替换一个元组,元素个数可以是多个。
输出:
arg1: two
arg2: 3
arg3: 5
在这个例子中:
- *args 解包元组 ("two", 3, 5) 并将这些值作为位置参数传递给函数 test_args_kwargs。
- 函数接收到的参数分别是 arg1 = "two",arg2 = 3,和 arg3 = 5。
二、**kwargs 在Python中是什么意思?
- **kwargs 允许你传递任意数量的关键字参数给函数。
- 在函数内部,**kwargs 被作为一个字典对待。
示例:
def test_args_kwargs(arg1, arg2, arg3):
print(f"arg1: {arg1}")
print(f"arg2: {arg2}")
print(f"arg3: {arg3}")
kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
test_args_kwargs(**kwargs)
输出:
arg1: 5
arg2: two
arg3: 3
在这个例子中:
- **kwargs 解包字典 {"arg3": 3, "arg2": "two", "arg1": 5} 并将这些值作为关键字参数传递给函数 test_args_kwargs。
- 函数接收到的参数分别是 arg1 = 5,arg2 = "two",和 arg3 = 3。
三、*args和**args主要区别
*args:用于处理不确定数量的位置参数。如果你不知道要传递给函数的参数数量,或者希望函数能够接受任意数量的参数时,就可以使用 *args。常见场景包括汇总多个值、处理多个输入等。
**kwargs:用于处理不确定数量的关键字参数。当你希望函数能够接受任意数量的带有名称的参数(键值对)时,可以使用 **kwargs。常见场景包括配置选项、动态设置参数等。
*args 用于传递可变数量的非关键字参数给函数。这些参数会被捕获为一个元组。
**kwargs 用于传递可变数量的关键字参数给函数。这些参数会被捕获为一个字典。
这两者可以一起使用,以同时接收位置参数和关键字参数。示例:
def test_args_kwargs(arg1, arg2, arg3, *args, **kwargs):
print(f"arg1: {arg1}")
print(f"arg2: {arg2}")
print(f"arg3: {arg3}")
print(f"args: {args}")
print(f"kwargs: {kwargs}")
test_args_kwargs(1, 2, 3, 4, 5, key1="value1", key2="value2")
输出:
arg1: 1
arg2: 2
arg3: 3
args: (4, 5)
kwargs: {'key1': 'value1', 'key2': 'value2'}
在这个例子中:
前三个参数被捕获为 arg1,arg2 和 arg3。
接下来的两个参数 4 和 5 被捕获为 args(一个元组)。
关键字参数被捕获为 kwargs(一个字典)。
四、学后总结
- *args 处理位置参数(参数的顺序很重要)。**kwargs 处理关键字参数(参数的名称和对应的值很重要)。
- *args 在函数内部是一个元组,你可以使用索引或循环来访问其中的元素。**kwargs 在函数内部是一个字典,你可以通过键来访问其中的值。
- 在调用函数时,使用 * 来解包列表或元组,将其作为位置参数传递。使用 ** 来解包字典,将其作为关键字参数传递。