如何在函数中使用默认参数
在编程中,我们常常需要定义一个函数,但有时候我们希望可以给函数一些默认参数,以便函数在没有传递这些参数时可以使用这些默认值。在Python中,我们可以使用关键字参数的方式定义默认参数,这使得函数调用更加灵活和方便。接下来我们就来看一下如何在函数中使用默认参数。
一、函数定义中的默认参数
我们可以在函数定义时给参数指定默认值,如下所示:
def func(name, age=18):
print("Name: %s, Age: %d" % (name, age))
上述函数中,age参数指定了默认值为18,这意味着在函数调用时,如果没有给age传递值,则函数会使用默认值。例如:
func("Tom")
func("Mary", 20)
次调用时,age参数使用了默认值18,输出结果为:Name: Tom, Age: 18
第二次调用时,age参数被传递了实参20,输出结果为:Name: Mary, Age: 20
二、注意事项
1.默认参数要放在参数列表的末尾
在定义函数时,如果有多个参数,并且其中某个参数需要指定默认值,则需要将该参数放在参数列表的最后。
例如,下面的函数定义会报错:
def func(age=18, name):
print("Name: %s, Age: %d" % (name, age))
这是因为默认参数age在列表中排在了开头,引发了语法错误。应该将它放在最后:
def func(name, age=18):
print("Name: %s, Age: %d" % (name, age))
2.默认参数不支持更改
在函数定义时指定默认参数,并不会使得该参数变成常量或者常量引用。因此在函数调用过程中,如果尝试修改默认参数的值,会遭到惨烈的失败。
例如,下面的代码尝试在函数内部修改默认参数的值,但是却没有得到理想的输出结果:
def func(age=18):
age = age + 1
print("Age: ", age)
func()
func()
func()
这里的代码想要输出1,2,3,但是结果却是:19,19,19。这是因为函数在定义时,已经取得了age参数的默认值18,并将其存储在内存中。在函数调用过程中每一次都是对这个默认值的引用,而且在函数内部将其修改不会影响到默认值本身。
如果要真正地修改默认参数,可以使用可变类型的参数(如列表或字典)。
三、默认参数使用的注意事项
1.使用None作为默认参数
在函数定义中,有时候我们会使用None作为默认参数的值。例如下面的代码:
def func(num=None):
if num is None:
num = []
num.append(1)
print(num)
上述函数中,首先判断num是否为None,如果是,则将其赋值为空列表。如果不是,则直接在其后面添加一个元素。这样的代码比较常见,也比较好用。
2.使用不可变类型作为默认参数
在函数定义时,如果默认参数使用了可变类型(如列表、字典等),为了避免默认参数之间相互影响,建议使用不可变类型。
例如,下面的代码就有问题:
def func(a=[]):
a.append(1)
print(a)
如果连续多次调用func(),会发现输出值不是期望的[1]、[1,1]、[1,1,1],而是[1]、[1,1]、[1,1,1,1]。这是因为a在函数定义时,已经取得了空列表的默认值,并将其存储在内存中。接下来,每次函数调用都在这个默认列表后面添加一个元素,导致输出值出现了叠加的情况。这里建议使用不可变类型。
下面是使用元组和None作为默认参数的示例:
# 使用元组作为默认参数
def func(a, b=(1,2,3)):
print(a,b)
# 使用None作为默认参数
def func1(a=None):
if a is None:
a = []
a.append(1)
print(a)
# 调用各种函数并输出返回值
a = 1
b = (4,5,6)
# 调用func(),不传递默认值
func(a)
# 调用func(),传递默认值
func(a,b)
# 调用func1(),不传递默认值
func1()
# 调用func1(),传递默认值
myList = [1,2,3]
func1(myList)
四、函数定义中的参数解包
有时候,我们还会使用参数解包的方式,将可变数量的参数传递给函数,并使用默认参数来填充未传递的参数值。例如:
def func(a, b=1, *c):
print(a, b, c)
# 调用函数
func(1)
func(1,2)
func(1,2,3,4,5)
上述函数中,*c表示可变数量的参数,这意味着函数可以接受任意数量的参数。如果没有传递c,它就会是一个空元组。如果传递了参数,则c将会存储它们。
如果希望b也使用参数解包,可以使用**dict来实现:
def func(a, b=1, **dict):
print(a, b, dict)
# 调用函数
func(1)
func(1,2)
func(1,2, c=3, d=4, e=5)
在上述函数中,**dict表示不定数量的关键字参数。如果没有传递关键字参数,它的值就是一个空字典。如果传递了参数,则将参数以键值对的形式存储在字典中。
总结
在Python中,我们可以使用默认参数来优化函数定义。使用默认参数可以使得函数调用更加方便和灵活,同时也可以提高代码的可读性和可维护性。但是需要注意的是,在使用默认参数的时候,我们需要避免出现一些容易出错的情况,如:默认参数不支持更改、默认参数应该放在参数列表的末尾、使用不可变类型作为默认参数等。希望通过本文的介绍,能帮助到大家在日常编程中更好地使用默认参数。
