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

Python函数:可变参数和默认参数示例

发布时间:2023-05-30 13:12:02

Python函数是编程中非常常见的一种代码抽象和复用技术,函数可以把代码逻辑划分为模块,提高代码可读性和可维护性。

在Python函数中,我们通常使用参数(Parameter)来传递输入值或输出值,参数分为形式参数(Formal Parameter)和实际参数(Actual Parameter)两种,其中形式参数也可以分为关键字参数(Keyword Argument)、默认参数(Default Argument)和可变参数(Variable Argument)三种。在本文中,主要介绍可变参数和默认参数的使用方法和注意事项。

一、可变参数

可变参数是指函数在定义时,允许使用不定数量的参数。在Python中,我们可以使用 *args 和 **kwargs 这两个特殊符号来表示可变参数。其中,*args 表示接收任意数量的位置参数;**kwargs 表示接收任意数量的关键字参数。在函数内部,*args 和 **kwargs 将分别转化为一个元组和一个字典,可以用来处理不确定数量或类型的输入参数。

下面是一个简单的函数示例:

def sum(*args):
    total = 0
    for arg in args:
        total += arg
    return total

这个函数可以接受任意数量的位置参数,并将它们求和返回。例如,sum(1,2,3,4) 的返回值为 10。在这个函数中,*args 将会将传递进来的所有位置参数转化为一个元组,函数内部使用 for 循环对其进行迭代,然后将所有参数相加。因此,这个函数既适用于 2 个数相加的情况,也适用于多个数相加的情况。

我们可以在函数中同时使用 *args 和其它参数,比如:

def add(a, b, *args):
    total = a + b
    for arg in args:
        total += arg
    return total

这个函数可以接受两个位置参数 a 和 b,同时还可以接受任意数量的位置参数,然后将它们相加并返回结果。例如,add(1,2,3,4) 的返回值为 10。

除了位置参数外,还可以使用 **kwargs 接受关键字参数。例:

def print_kwargs(**kwargs):
    print(kwargs)

在这个函数中,**kwargs 将接受传递进来的所有关键字参数,并将它们转化为一个字典。我们可以使用这个函数来打印任意数量的关键字参数,比如:

print_kwargs(a=1, b=2, c=3)   # 输出 {'a': 1, 'b': 2, 'c': 3}

需要注意的是,函数定义时必须将 *args 和 **kwargs 放在形式参数列表的最后面。例如,下面这个函数定义就是错误的:

def sum(*args, a, b): # 错误的函数定义
    # ...

因为如果 *args 和 **kwargs 放在前面,Python 解释器无法分辨出在 *args 和 a、b 参数之间应该划分哪一部分输入参数。

二、默认参数

默认参数是指在函数定义时就给形参指定一个默认值,这样在调用函数时,即便缺少该参数也不会报错。Python 中允许使用一个 = 号来给形式参数指定一个默认值。例如:

def greet(name, greeting='Hello'):
    print(greeting + ', ' + name + '!')

greet('Bob')            # 输出 'Hello, Bob!'
greet('Alice', 'Hi')    # 输出 'Hi, Alice!'

在这个函数中,greeting 参数有一个默认值 'Hello'。在调用 greet 函数时,如果没有传入 greeting 参数,它就会使用默认值 'Hello'。如果传入了 greeting 参数,它就会使用传入的值。

需要注意的一点是,如果一个函数中有多个默认值参数,则每个默认值参数都必须放在后面的位置。也就是说,非默认参数必须放在前面,其后是带默认值的参数。例如,下面这个定义是错误的:

def greet(greeting='Hello', name):
    print(greeting + ', ' + name + '!')

错误原因和可变参数相同,也是因为 Python 解释器无法判断提供的参数和哪个形式参数关联,因此必须保证所有默认参数都在最后面。

如果参数列表中既有默认参数,又有可变参数,那么需要将可变参数放在默认参数之前。例如:

def foo(a, b=3, *args):
    # ...

这个函数中,有一个默认参数 b,和一个可变参数 args。args 必须放在 b 参数的后面,否则会导致 Python 解释器无法确定传递的参数与哪个形式参数对应。

总结

Python 函数中有三种形式参数:可变参数、默认参数和关键字参数。其中可变参数使用 *args 和 **kwargs 表示,用于接收任意数量的位置参数和关键字参数,将它们转化为元组和字典类型。而默认参数用于在函数定义时就给形式参数指定一个默认值,这样在函数调用时可以省略该参数,从而使代码更加简洁。在使用默认参数时需要注意将它们放在形式参数列表的最后面,而且非默认参数必须放在默认参数的前面。