Python 函数中的默认参数值
在Python函数中,默认参数值是指在定义函数时给参数设置的默认值,这样在调用函数时,如果没有传入对应参数的值,函数就会使用这个默认值,从而简化函数调用的方式。默认参数值在Python中非常常用,因为它们可以减少代码量,并提高代码的可读性和可维护性。
语法格式
在Python中,定义函数时设定默认参数值的语法格式为:
def function_name(param1=default_value1, param2=default_value2, param3=default_value3):
# 函数体
其中,param1, param2, param3是需要传入的参数,default_value1, default_value2, default_value3是对应的默认参数值。
举例
下面是一个简单的函数例子,其中有两个参数,分别是name和age,age参数设置了默认值为18:
def print_info(name, age=18):
print("name:", name)
print("age:", age)
调用这个函数时,如果只传入name参数,那么age参数将会使用默认值18:
print_info("Tom")
输出结果为:
name: Tom
age: 18
如果传入了age参数,则会使用传入的参数值:
print_info("Tom", 20)
输出结果为:
name: Tom
age: 20
当然,你也可以同时传入两个参数值:
print_info("Tom", age=20)
同样输出结果为:
name: Tom
age: 20
需要注意的是,默认参数值只会按照函数定义时的顺序依次设置。如果在函数定义时后面有默认参数,而在函数调用时只传入了前面的参数,则默认参数将不会被赋值:
def print_info(name, age=18, gender="male"):
print("name:", name)
print("age:", age)
print("gender:", gender)
print_info("Tom")
输出结果为:
name: Tom
age: 18
gender: male
这个例子中,虽然在定义函数时设置了一个默认参数gender="male",但是在调用函数时只传入了两个参数,因此gender参数保持默认值不变。
需要特别注意的是,当默认参数值是可变对象时,由于函数定义时只会执行一次,所以在多次调用函数时,如果在这个默认参数被修改了,那么会对后面的函数调用产生影响。例如:
def add_item(item, items=[]):
items.append(item)
return items
print(add_item("apple"))
print(add_item("banana"))
print(add_item("orange"))
输出结果为:
['apple']
['apple', 'banana']
['apple', 'banana', 'orange']
这个例子中,add_item函数有两个参数,分别是item和items,其中items默认值是一个空列表[]。如果在函数调用时只传入了item参数,则会把item添加到列表中,然后返回列表。在 次调用时,由于items列表是空的,默认参数值[]就会被赋值,并添加了"apple"后返回['apple']。然后在第二次调用时,由于默认参数值[]已经存在于内存中了,因此会继续使用这个列表,并添加"banana",然后返回['apple', 'banana']。在第三次调用时,依然是直接使用默认参数值[],并添加"orange",然后返回['apple', 'banana', 'orange']。可以看到,由于默认参数值是可变的,它们的值会一直存储在内存中,而不是在每次函数调用时重新生成,导致多次调用时存在的影响。
为了避免这个问题,需要把默认参数值设为不可变类型,例如None:
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item("apple"))
print(add_item("banana"))
print(add_item("orange"))
输出结果为:
['apple']
['banana']
['orange']
这个改进后的例子中,在函数调用时如果没有传入items参数,而是使用了None,这时就新生成了一个空列表,并把item添加到这个列表中。在后面的多次调用中,由于没有使用默认参数值,而是用一个新生成的空列表,因此不会存在问题。
总结
Python函数中默认参数值的使用非常常见。在设计函数时,我们可以通过使用默认参数,来简化函数的调用方式。并且需要注意,默认参数值是在函数定义时计算一次,之后被重复使用,所以在设置默认参数值时,需要注意是不是可变对象。如果默认参数值是可变对象,那么需要设置一个None的默认值,然后在函数内部进行判断和处理。
