Python中函数的参数和默认参数
Python中的函数参数非常灵活,可以根据需要定义不同类型的参数,包括位置参数、关键字参数、默认参数等。
位置参数是最基本的参数类型,在函数定义时需要按照顺序传递。
例如:
def add(x, y):
return x + y
add(1, 2) # 3
在上面的例子中,add函数有两个位置参数x和y,在调用时需要按照顺序传递。
关键字参数是根据参数名指定的参数,可以不按照顺序传递,可以有默认值。使用关键字参数可以增强函数的可读性,减少因为传入参数位置顺序错误导致的错误发生。
例如:
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来处理可变数量的参数。在使用默认参数时,要注意参数默认值一般指向不可变对象,或者重写函数使用不可变对象。
