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

如何定义有默认参数的Python函数?

发布时间:2023-06-19 04:58:41

在Python中,我们可以使用函数来封装可重复使用的代码块。函数可以接受参数来输入不同的值并产生不同的结果。当我们定义函数时,我们可以指定参数的默认值,这些默认值在函数被调用时可以被重写。在这篇文章中,我们将讨论如何定义有默认参数的Python函数。

默认参数

默认参数是在函数定义中给出的某些参数,当函数被调用时可以省略。当省略这些参数时,函数将使用预定义的默认值。在Python中,我们通过在参数名称后放置等于号和默认值来指定默认参数。例如,下面的函数定义了一个有默认参数的函数:

def greeting(name='guest'):
    print("Hello, " + name)

在这个例子中,我们定义了一个名为“greeting”的函数,它有一个名为“name”的参数,并在参数名称后放置等于号和默认值“guest”。如果我们调用这个函数而没有提供“name”参数的值,它会使用默认值“guest”输出“Hello, guest”。

greeting()             # Output: Hello, guest
greeting('John')       # Output: Hello, John

在这个例子中,我们在 次调用“greeting”函数时没有提供任何参数,并使默认值“guest”生效。在第二次调用中,我们提供了一个值为“John”的“name”参数来覆盖默认值“guest”。

位置参数和默认参数

默认参数的位置非常重要。在Python中,默认参数必须始终出现在非默认参数的后面。这是因为默认参数的值在编译时被绑定到函数对象上,而非默认参数在运行时被绑定到函数传递给它们的值上。

下面是一个定义了一个参数“name”和一个默认参数“age”的函数:

def about_people(name, age=30):
    print(name + " is " + str(age) + " years old")

在这个例子中,我们定义了一个名为“about_people”的函数,它有一个名为“name”的参数和一个名为“age”的默认参数,其默认值为30。如果我们调用这个函数时只提供一个参数值,Python将使用默认值“30”作为“age”参数的值。

about_people("Alice")         # Output: Alice is 30 years old
about_people("Bob", 40)       # Output: Bob is 40 years old

在这个例子中,我们调用了两次“about_people”函数。 次我们只提供了一个值为“Alice”的“name”参数,Python使用默认值“30”作为“age”参数的值。第二次我们提供了一个值为“Bob”的“name”参数和一个值为“40”的“age”参数。在这个例子中,默认参数“age”在参数列表的后面,即在非默认参数“name”的后面。

注意点

在Python中,我们可以使用任何类型的对象作为默认参数的值。这包括数字、字符串、列表、元组、字典、函数等等。但是,请注意,在使用可变对象(如列表和字典)作为默认参数值时,要小心,因为它们的值在函数调用之间是共享的。如果我们修改一个默认参数,并在多个函数调用之间共享这个默认参数,这将可能导致意外的结果。

例如,下面的函数使用可变列表作为它的默认参数,并将一个值添加到这个列表:

def add_to_list(element, my_list=[]):
    my_list.append(element)
    print(my_list)

如果我们调用这个函数三次,每次都没有传递一个新的列表作为参数值,Python将使用同一个默认列表对象作为参数。由于这个默认列表是可变的,所有函数调用都可以修改它。这意味着,如果我们在这个列表上添加了一个元素,它将在下一次函数调用中保持不变。

add_to_list(1)           # Output: [1]
add_to_list(2)           # Output: [1, 2]
add_to_list(3)           # Output: [1, 2, 3]

在这个例子中,我们调用了三次“add_to_list”函数,但每一次我们都没有提供一个新的“my_list”参数值。由于默认参数在函数定义时被求值,因此 次调用使用的默认列表也被第二次和第三次调用使用。因为每次调用中都修改了这个列表,所以最后的结果包含了所有的添加元素。

为了避免这个问题,我们可以使用None作为默认参数值,并在函数中检查参数是否为None。如果它是None,我们可以创建一个新的空列表来使用。

def add_to_list(element, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(element)
    print(my_list)

在这个例子中,如果我们调用“add_to_list”函数而不提供一个新列表作为参数值,Python将使用None作为默认参数值,并在函数内部检查这个参数。如果这个参数是None,我们将创建一个新的空列表来使用。这确保了在多次函数调用之间使用默认参数时,我们使用的总是一个新的列表对象。