欢迎访问宙启技术站
智能推送

如何使用Python函数的默认参数、可变参数、关键字参数?

发布时间:2023-05-26 07:58:26

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表示接受任意个关键字参数;

- 关键字参数:通过传递键值对的形式,接受任意个关键字参数。必须在定义函数时用双星号来定义关键字参数,必须放在其他类型的参数后面。