📅  最后修改于: 2023-12-03 15:34:27.508000             🧑  作者: Mango
在 Python 中,函数可以带有参数,其中参数可以是默认参数。默认参数的值在函数的定义中给出,并在函数调用中可以被省略。
默认参数的一个典型的例子是 print
函数的 end
参数。默认情况下,print
函数使用换行符 "\n"
作为结束符,但是这个结束符可以被设置为任意字符串。
print("Hello, world!", end="")
在上面的例子中,我们将 end
参数设置为空字符串,因此 print
函数不会再输出换行符。
要定义一个带有默认参数的函数,请在参数列表的末尾给出它的值。
def greet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
在上面的例子中,我们定义了一个 greet
函数,这个函数有两个参数:name
和 greeting
。如果调用这个函数时不指定 greeting
参数,它将默认为字符串 "Hello"
。
greet("Alice")
greet("Bob", "Hi")
在上面的例子中,greet("Alice")
将输出 "Hello, Alice!"
,而 greet("Bob", "Hi")
将输出 "Hi, Bob!"
。
当多个参数都有默认值时,除了最后一个参数,其他参数通常应该放在它们后面具有默认值的参数的后面。这是因为,如果默认参数在非默认参数之前出现,那么调用该函数时必须明确指定那些参数的值,这将降低函数的可读性和易用性。
def foo(a=1, b=2, c=3):
pass
在上面的例子中,参数 a
必须在参数 b
和 c
之前指定,否则调用将失败。
foo(b=4, c=5) # 可行
foo(b=4, c=5, a=6) # 可行
foo(4, 5) # 不可行
此外,如果默认参数的值是可变的(如列表或字典),则可能会遇到一些令人惊奇的行为。这是因为默认值在函数定义时求值,而不是每次调用该函数时求值。这意味着在默认值是可变对象时,如果多次调用带有默认参数的同一个函数,则修改默认参数的值可能会影响后续调用。解决这个问题的方法是使用不可变对象作为默认参数的值,或者改用关键字参数。
def buggy_append(item, lst=[]):
lst.append(item)
return lst
print(buggy_append(1))
print(buggy_append(2))
print(buggy_append(3, []))
在上面的例子中,第一个和第二个 print
语句都将分别输出 [1]
和 [1, 2]
,但是这不是我们期望的结果。这是因为在第一次调用 buggy_append()
函数时,列表被赋予了默认值 []
,这是一个可变对象。在第二次调用函数时,它仍然使用相同的默认值,但是这次,由于第一次调用已经修改了列表,所以它的输出是错误的。为了避免这个问题,我们可以使用 None
作为默认值,并在函数中检查是否提供了当前默认值的替代值。这被称为 "惯用的"。