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

Python函数-函数参数的默认值?

发布时间:2023-06-24 16:36:07

函数参数的默认值是指在定义函数时,给函数参数指定了一个默认值。如果在调用函数时没有传入该参数的值,就会使用默认值作为参数的值。

Python函数的参数有两种类型,一种是位置参数,用于指定函数执行时传入的值,另一种是关键字参数,在调用函数时使用参数名称来指定哪个参数应该接收特定的值。

函数参数的默认值主要用于在不确定参数值时,提供一个可选的默认值。这样可以简化代码,减少函数调用的复杂度,并且更容易使用。

定义函数参数的默认值

通过在函数定义中为参数指定默认值,可以定义函数参数的默认值。默认值的语法非常简单:将参数列表中的变量名和默认值分别用等号连接即可。

下面是一些示例:

def greet(name, greeting='Hello'):
    print(greeting, name)
    
#调用函数
greet('Alice')          # outputs "Hello Alice"
greet('Bob', 'Hi')      # outputs "Hi Bob"
greet('Charlie', greeting='Bonjour') # outputs "Bonjour Charlie"

在这个示例中,我们定义了一个greet()函数来打招呼。greet()函数有两个参数, 个是名称,第二个是用于打招呼的字符串。如果没有为第二个参数提供值,则默认为'Hello'

在 个函数调用中,我们只传入了一个参数,因此greeting参数将使用默认值。在第二个函数调用中,我们为greeting参数显式提供了值,因此传递给函数的参数将是'Hi'。另外,在第三个函数调用中,使用关键字参数指定了不同的默认值。

注意:有一些重要的注意事项需要记住,当参数经过多次调用不想改变默认值时,应该遵循以下规则:

- 默认参数必须是不可变的(如字符串、数字、元组)

- 默认参数只计算一次,并且它们在Python中是在解释时分配的。

默认参数的问题

我们在默认参数中说明的问题称为可变参数问题。如果程序员创建一个默认值为[]的参数,在每次调用函数之间,Python会使用同一个列表。如果其中一个函数更改了列表中的值,那么这个函数的任何后续调用都会受到更改的影响。

例如,考虑下面的函数:

def add_element(elem, lst=[]):
    lst.append(elem)
    print(lst)

add_element(1)   # 输出 [1]
add_element(2)   # 输出 [1, 2]
add_element(3)   # 输出 [1, 2, 3]

它应该添加传递的元素到一个列表中。但是,由于我们在定义函数时使用了默认值参数,代码执行结果却不是我们想要的。

次调用add_element()函数时,它添加了元素1并打印输出了[1]。然后,在第二次调用add_element()函数时,它添加了元素2并打印输出了[1, 2]。我们在接下来的第三次调用时,继续传递一个元素3,也添加了到我们的列表,现在列表是[1, 2, 3]

这个问题的原因是,函数参数的默认值只计算一次,并且在每个函数调用之间保持不变。在这个示例中,由于列表在函数定义中作为默认值指定,所以它在每个函数调用之间都保持不变。

为了避免这个问题,应该将默认参数设置为不可变类型,例如:字符串、数字或元组等。使用不可变的默认参数可以避免这个问题,因为它们在函数每次调用时都被重新创建。

例如,我们可以使用元组来避免上面的问题,如下所示:

def add_element_tuple(elem, lst=None):
    if lst is None:
        lst = []
    lst.append(elem)
    print(lst)

add_element_tuple(1)  # 输出[1]
add_element_tuple(2)  # 输出[2]
add_element_tuple(3)  # 输出[3]

在这个例子中,我们使用了一个元组来代替之前的列表作为默认值。在函数主体内,我们首先判断列表是否为None(即不存在),并使用新列表重新赋值。

总结

函数参数的默认值可以使程序员编写更灵活的函数。使用默认参数可以确保在调用函数时可以省略某些参数,同时也可以为每个参数提供默认值。当使用默认值的变量时,我们仅在需要时指定相应的参数即可。

但是需要注意的是,如果默认参数是一个可变对象,那么将会在每次函数调用之间共享相同的对象。要避免这个问题,应该使用不可变类型的默认参数。