如何使用Python函数的默认参数、可变参数、关键字参数?
Python函数的参数分为四类:位置参数、默认参数、可变参数和关键字参数。这篇文章将为大家详细介绍如何使用默认参数、可变参数和关键字参数。
默认参数
默认参数是函数定义时,指定参数的默认值,在函数调用时如果没有传入对应的参数,则默认使用指定的参数值。在定义函数时,可以通过在形参名称后面加上“=”号以及默认值,指定参数的默认值。例如:
def func(x, y=5):
print(x+y)
当函数被调用时,如果没有传入y参数,则默认使用y=5:
func(3) # 输出8
函数中还有一个需要注意的点:默认参数的默认值,在函数定义时确定,并不会随着函数的调用而改变。以下代码展示了这个点:
def func(x, y=[]):
y.append(x)
print(y)
调用该函数三次:
func(1) # 输出[1]
func(2) # 输出[1, 2]
func(3) # 输出[1, 2, 3]
出现这种情况的原因在于,Python在定义函数时,会在内存中创建一个默认列表,来赋给y参数。而这个默认列表是一直在内存中存在的,所以使用了默认参数时,需要注意默认参数的默认值是否会影响后续函数调用。如果不想要这种情况发生,可以将y的默认值指定为None,并在函数中加上判断逻辑。例如:
def func(x, y=None):
if y is None:
y = []
y.append(x)
print(y)
可变参数
当函数的参数在调用时,数量无法确定,或者需要传入的参数更多时,可以使用可变参数。Python提供了两种可变参数的语法:*args用来传递任意数量的位置参数,**kwargs用来传递任意数量的关键字参数。
*args用法:
def func(a, b, *args):
print(a, b, args)
此时,args是一个元组,包含从第三个参数开始的所有位置参数:
func(1, 2) # 输出 1 2 ()
func(1, 2, 3) # 输出 1 2 (3,)
func(1, 2, 3, 4) # 输出 1 2 (3, 4)
**kwargs用法:
def func(a, b, **kwargs):
print(a, b, kwargs)
kwargs是一个字典,包含从第三个参数开始的所有关键字参数:
func(1, 2) # 输出 1 2 {}
func(1, 2, c=3) # 输出 1 2 {'c': 3}
func(1, 2, c=3, d=4) # 输出 1 2 {'c': 3, 'd': 4}
当然,可变参数可以与默认参数一起使用。例如:
def func(a, b=5, *args, **kwargs):
print(a, b, args, kwargs)
此时需要注意的是,带默认值的参数必须放在*args和**kwargs的前面。
func(1) # 输出 1 5 () {}
func(1, 2, 3) # 输出 1 2 (3,) {}
func(1, 2, 3, d=4, e=5) # 输出 1 2 (3,) {'d': 4, 'e': 5}
关键字参数
关键字参数,顾名思义,是通过关键字来指定参数的一种方式。在函数定义时,可以使用双星号(**)来定义关键字参数,它会将所有的关键字参数存放到一个字典中,传递给函数。例如:
def func(x, y, **kwargs):
print(x, y, kwargs)
此时,函数可以接受任意个关键字参数,存放于kwargs字典变量中:
func(1, 2, a=3, b=4, c=5) # 输出 1 2 {'a': 3, 'b': 4, 'c': 5}
如果函数中存在着其他类型的参数,则必须先接收其他类型的参数,然后再接收关键字参数。
def func(x, *args, **kwargs):
print(x, args, kwargs)
此函数定义中,'x'位置参数和'*args'可变位置参数均不接收关键字参数,而'**kwargs'关键字参数则可以接受任意个关键字参数:
func(1, 2, 3, a=4, b=5, c=6) # 输出 1 (2, 3) {'a': 4, 'b': 5, 'c': 6}
总结:
- 默认参数:在函数定义时,指定参数的默认值,调用函数时如果没有传入参数,使用默认值,注意默认值是在函数定义时确定,且与函数调用无关;
- 可变参数:*args表示接受任意个位置参数,**kwargs表示接受任意个关键字参数;
- 关键字参数:通过传递键值对的形式,接受任意个关键字参数。必须在定义函数时用双星号来定义关键字参数,必须放在其他类型的参数后面。
