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

如何在函数中使用默认参数

发布时间:2023-05-22 10:31:01

在编程中,我们常常需要定义一个函数,但有时候我们希望可以给函数一些默认参数,以便函数在没有传递这些参数时可以使用这些默认值。在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中,我们可以使用默认参数来优化函数定义。使用默认参数可以使得函数调用更加方便和灵活,同时也可以提高代码的可读性和可维护性。但是需要注意的是,在使用默认参数的时候,我们需要避免出现一些容易出错的情况,如:默认参数不支持更改、默认参数应该放在参数列表的末尾、使用不可变类型作为默认参数等。希望通过本文的介绍,能帮助到大家在日常编程中更好地使用默认参数。