Python函数的可变参数指的是函数定义时不确定参数数量的情况下,可以使用的特殊参数类型。在Python中,可变参数包括两种类型,分别是*args
和**kwargs
,下面我们分别来介绍一下。
*args
可变参数
*args
表示将所有的位置参数(不包括关键字参数)打包成一个元组(tuple)并传递给函数,那么函数内部就可以通过访问这个元组来获取参数的值。
使用方法如下:
def func(*args):
# 访问args元组
for arg in args:
print(arg)
# 调用函数传入多个参数
func(1, "hello", [1,2,3])
代码执行结果为:
1
hello
[1, 2, 3]
从这个例子中可以看出,不管我们传入多少个参数,最终都会打包成一个元组。在函数内部,可以通过使用for
循环遍历整个元组,并访问其中的每个元素。
同时,我们也可以对传入的参数进行解包,并进行单独的访问,代码如下所示:
def func(a, b, *args):
print(a)
print(b)
for arg in args:
print(arg)
# 调用函数传入多个参数
func(1, "hello", [1,2,3], 4, True)
代码执行结果为:
1
hello
[1, 2, 3]
4
True
从这个例子中可以看出,我们可以将前两个参数进行解包,而后面的参数则会被打包成一个元组传入函数内部。
**kwargs
可变参数
**kwargs
表示将所有的关键字参数打包成一个字典(dict)并传递给函数,那么函数内部就可以通过访问这个字典来获取参数的值。
使用方法如下:
def func(**kwargs):
# 访问kwargs字典
for key, value in kwargs.items():
print("{}:{}".format(key, value))
# 调用函数传入多个关键字参数
func(name="Jack", age=25, gender="male")
代码执行结果为:
name:Jack
age:25
gender:male
从这个例子中可以看出,不管我们传入多少个关键字参数,最终都会打包成一个字典。在函数内部,可以通过使用for
循环遍历整个字典,并访问其中的每个键值对。
同时,我们也可以混合使用*args
和**kwargs
来实现对不确定参数类型、数量的处理,示例代码如下:
def func(a, b, *args, **kwargs):
print(a)
print(b)
for arg in args:
print(arg)
for key, value in kwargs.items():
print("{}:{}".format(key, value))
# 调用函数并传入多种类型、数量的参数
func(1, "hello", [1,2,3], 4, True, name="Jack", age=25, gender="male")
代码执行结果为:
1
hello
[1, 2, 3]
4
True
name:Jack
age:25
gender:male
从这个例子中可以看出,我们可以在函数定义的时候加入*args
和**kwargs
,来处理不确定类型、数量的参数。然后在函数内部通过访问元组和字典来获取参数的值。
需要注意的是,在传入参数时,*args
和**kwargs
需要放在前面,示例代码如下:
def func(*args, **kwargs):
pass
# 加*args和**kwargs在后面会报错
def wrong_func(a, b, **kwargs, *args):
pass