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

在Python中创建带有默认参数的函数的方法是什么?

发布时间:2023-06-23 02:19:02

在Python中创建带有默认参数的函数方法,是一项非常有用的功能。默认参数是在定义函数时定义的一个值,这个值可以在函数调用时省略。当调用函数时没有传递参数时,该参数将使用默认值。以下是创建带有默认参数的函数的方法:

1.定义函数并设置一个参数的默认值

要设置一个默认参数值,只需在定义函数时指定参数名称和默认值即可。例如:

def greet(name, salutation='Mr.'):
    print(f'Hello, {salutation} {name}')

在上面的示例中,salutation参数具有默认值'Mr.',并且可以在调用函数时忽略。如果没有传递salutation参数,则使用默认值'Mr.'。

2.调用函数时使用默认参数值

调用具有默认参数的函数时,可以忽略参数并使用默认值。例如:

greet('Smith')   # Hello, Mr. Smith
greet('Johnson', 'Mrs.')   # Hello, Mrs. Johnson

在上面的示例中, 个调用忽略了salutation参数,因此使用了默认值。第二个调用传递了salutation参数,并使用了传递的值。

需要注意的是,不能在函数定义中将有默认值的参数的默认参数之前定义:

# 对
def foo(a, b, c=0, d=0):
    pass

# 错误
def bar(a=0, b, c, d):
    pass

3.函数定义中的顺序和默认参数

当定义具有默认参数的函数时,应注意定义的顺序。所有具有默认值的参数必须位于所有不具有默认值的参数的后面。这是因为Python根据参数的位置来确定传递值的方式。如果一个具有默认值的参数出现在一个没有默认值的参数之前,则这些值被认为是在错误的位置上,解释器会引发错误。例如:

# 对
def greet2(name, salutation='Mr.'):
    print(f'Hello, {salutation} {name}')

# 错误
def greet3(salutation='Mr.', name):
    print(f'Hello, {salutation} {name}')

在上面的示例中,greet2函数定义是有效的,因为salutation参数在没有默认值的name参数之后定义。greet3函数定义是无效的,因为salutation参数在name参数之前定义,并且没有默认值。

4. 当函数的默认值是可变对象时的问题

需要小心的是,当函数的默认值是可变对象时,可以造成不必要的困扰。

def add_number(li=[]):
    li.append(len(li))
    return li

add_number()
# [0]

add_number()
# [0, 1]

add_number()
# [0, 1, 2]

在这个例子中,我们定义了一个名为add_number()的函数,并将可变的列表对象[]赋值给li参数。在函数体中,我们将这个列表与它的长度连接在一起并返回。 次调用add_number()函数时,任何事情都不会出错。输出是预期的[0]值。然而,当我们再次调用这个函数时,结果变得有趣了。输出变成了[0, 1]。再一次调用结果变成了[0, 1, 2]。原因是,由于Python函数定义只在程序执行过程中运行一次,因此具有默认参数值的可变对象在所有函数调用之间实际上是同一个对象。因此,当该函数被调用时,命名参数取自默认对象,并导致所有调用之间共享同一个列表对象。

解决方法可如下:

def add_number(li=None):
    if li is None:
        li = []
    li.append(len(li))
    return li

add_number()
# [0]

add_number()
# [0]

在这个修改后的例子中,我们在函数开始时检查li是否None。如果是,我们创建一个新列表对象并将其分配给li。在这种情况下,由于Python中创建了一个新列表对象,所以想要的结果现在得到了保证。