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

Python中函数的参数和默认参数

发布时间:2023-06-21 10:06:05

Python中的函数参数非常灵活,可以根据需要定义不同类型的参数,包括位置参数、关键字参数、默认参数等。

位置参数是最基本的参数类型,在函数定义时需要按照顺序传递。

例如:

def add(x, y):
     return x + y

add(1, 2) # 3

在上面的例子中,add函数有两个位置参数xy,在调用时需要按照顺序传递。

关键字参数是根据参数名指定的参数,可以不按照顺序传递,可以有默认值。使用关键字参数可以增强函数的可读性,减少因为传入参数位置顺序错误导致的错误发生。

例如:

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

greet("Bob") # Hello, Bob
greet("Bob", message="Hi") # Hi, Bob
greet(name="Bob", message="Hi") # Hi, Bob

在上面的例子中,greet函数有两个参数,name是位置参数,message是关键字参数,它有一个默认值"Hello"。在 个调用中,只传递了一个位置参数,message使用默认值;在第二个调用中,通过关键字参数指定了message的值;在第三个调用中,同时使用了位置参数和关键字参数。注意:如果同时使用了位置参数和关键字参数,位置参数必须在前面传递。

默认参数是关键字参数的一种,它们是定义在函数参数列表末尾的参数,可以在函数被调用时不传递,使用默认值。

例如:

def power(x, n=2):
    return x ** n

power(2) # 4, n使用默认值2
power(2, 3) # 8, n被传入了3

在上面的例子中,power函数有两个参数,x是位置参数,n是默认参数,它的默认值为2。在 个调用中,n使用了默认值;在第二个调用中,n被传入了3

注意:默认参数必须指向不可变对象,因为默认参数只在函数定义时求值一次,而不是每次调用时都重新求值。

例如:

def foo(a=[]):
    a.append(1)
    return a

print(foo()) # [1]
print(foo()) # [1, 1]

在上面的例子中,foo函数有一个默认参数a,它是一个空列表。在 个调用中,a被求值并返回了一个空列表,添加了一个元素1;在第二个调用中,事实上使用的是 个调用中返回的列表,所以结果为[1, 1]

如果默认参数指向的是可变对象,应该使用不可变对象的方式重写函数:

def foo(a=None):
    if a is None:
        a = []
    a.append(1)
    return a

print(foo()) # [1]
print(foo()) # [1]

在上面的例子中,foo函数接收一个关键字参数a,如果没有传递,则用一个空的列表。在每次调用时,都会创建一个新的列表对象,所以第二次调用的结果仍然是[1]

总之,Python中的函数参数和默认参数是非常灵活的,可以根据需要定义不同类型的参数。还可以使用*args**kwargs来处理可变数量的参数。在使用默认参数时,要注意参数默认值一般指向不可变对象,或者重写函数使用不可变对象。