📜  Python中的默认参数(1)

📅  最后修改于: 2023-12-03 15:34:27.508000             🧑  作者: Mango

Python中的默认参数

在 Python 中,函数可以带有参数,其中参数可以是默认参数。默认参数的值在函数的定义中给出,并在函数调用中可以被省略。

默认参数的一个典型的例子是 print 函数的 end 参数。默认情况下,print 函数使用换行符 "\n" 作为结束符,但是这个结束符可以被设置为任意字符串。

print("Hello, world!", end="")

在上面的例子中,我们将 end 参数设置为空字符串,因此 print 函数不会再输出换行符。

定义函数时的默认参数

要定义一个带有默认参数的函数,请在参数列表的末尾给出它的值。

def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")

在上面的例子中,我们定义了一个 greet 函数,这个函数有两个参数:namegreeting。如果调用这个函数时不指定 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 必须在参数 bc 之前指定,否则调用将失败。

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 作为默认值,并在函数中检查是否提供了当前默认值的替代值。这被称为 "惯用的"。