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

Python函数中参数的默认值是什么

发布时间:2023-05-20 14:59:36

Python函数中定义参数时,往往会给定一些默认值,这些默认值在函数被调用时,如果没有被指定,就会被当做参数传入函数中。Python函数中参数的默认值是指,在定义函数时,参数值被设置的默认值。当调用函数时,可以选择不传递该参数,这时就会使用默认值。Python中,函数参数的默认值是可以通过修改函数定义来实现的,下面我们来详细介绍Python函数中参数的默认值。

一、使用默认值的参数定义方式

在Python中,函数的参数可以设定默认值,如下所示:

def print_info(name='Yan', age=18):
    print('My name is %s, and I am %d years old.' % (name, age))

在这个函数的定义中,name和age都有默认值,如果调用这个函数而不传入这两个参数,这些参数就会取它们的默认值。

二、函数默认值的用途

使用默认值的函数参数是Python中很方便的一种函数参数定义方式,它的作用主要有以下三个方面:

1.参数可选性

如果有些函数参数的值不是必须的,就可以使用默认值来确保函数的调用不会出错,并且在不需要这些参数值的情况下,也可以省略它们。

例如,我们可以定义计算两个数字之和的函数add(x,y),y是可选参数,如果不提供y,则默认为0。

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

在使用这个函数时,如果只给出一个参数则默认y为0。

print(add(2)) # 输出2

如果两个参数都提供,则使用两个参数来计算输出结果。

print(add(2,4)) # 输出6

2.简化函数调用

有时,函数的多个参数可能都有一个适当的值,这时候使用默认值就可以避免在每次调用函数时去提供这些值。

例如,在OS模块中的open()函数中,参数mode和encoding都有默认值。

file = open("file.txt","r", encoding = "utf-8")

如果不对它们进行指明,函数也可以正确地执行。

3.函数可扩展性

如果未来会有新的需求,需要增加新的参数,则这些参数也可以使用默认值,不破坏原有函数的调用方式。这种方式可以让函数变得更加灵活和可扩展。

三、默认值数据类型

函数参数的默认值可以是任何Python类型,包括数字、字符串、列表、元组、字典和其他对象。但是,如果使用可变对象作为默认值,可能会导致预想不到的问题。

下面分别介绍五种默认值类型:

1.数字类型

当定义函数时,可以将一个数字作为默认参数值,如下所示:

def greet(name, age=18):
    print(f"Hi, {name}. Your age is {age}.")

# 调用函数
greet("jack")  # Hi, jack. Your age is 18.
greet("Tom", 20)  # Hi, Tom. Your age is 20.

在上面的代码中,函数greet()的第二个参数默认是18。如果不传递任何参数,则使用默认值。否则,用传递的值替换默认值。

2.字符串类型

同样,一个字符串也可以作为函数的默认参数。

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

# 调用函数
greet('John')   # John, Hello!
greet('Jane', 'Good morning!')  # Jane, Good morning!

在上面的代码中,函数greet()有一个字符串型的默认参数message,如果没有指定参数,则使用“Hello”作为默认参数值。

3.元组类型

使用元组作为函数默认参数时,需要注意元组传递方式,如下所示:

def do_something(a, b, c=(1, 2, 3)):
    print(a, b, c)

# 调用函数
do_something(1, 2, (4, 5, 6))  # 1 2 (4, 5, 6)
do_something(1, 2)  # 1 2 (1, 2, 3)

在上面的代码中,函数do_something()有一个元组型的默认参数c,默认是(1, 2, 3)。如果不传递任何参数,则使用默认值。否则,用传递的值替换默认值。在替换元组时需要注意元组使用方式。

4.列表类型

使用列表作为函数的默认参数时,需要注意列表传递方式的不同,如下所示:

def do_something(a, b, c=[1, 2, 3]):
    print(a, b, c)

# 调用函数
do_something(1, 2, [4, 5, 6])  # 1 2 [4, 5, 6]
do_something(1, 2)  # 1 2 [1, 2, 3]
do_something(1, 2)  # 1 2 [1, 2, 3]

在上面的代码中,函数do_something()有一个列表型的默认参数c,默认是[1, 2, 3]。如果不传递任何参数,则使用默认值。但是,如果多次调用这个函数,则可能会出现问题。

由于Python在定义函数时会默认生成一个函数常量,因此,同样的默认列表将以相同的常量值出现在所有函数调用中。

这个特殊的行为很容易理解:在定义函数时,Python将参数默认值存储为函数常量,而不是每次执行函数时重新计算默认值。因此,在多次执行函数时,它不会重新计算默认值,而是使用之前的值。

当一个函数在执行期间修改默认列表值时,所有函数调用都受到影响。

5.字典类型

使用字典作为函数默认参数同样需要注意,如下所示:

def do_something(a, b, c={'x': 1, 'y': 2, 'z': 3}):
    print(a, b, c)

# 调用函数
do_something(1, 2, {'x': 10, 'y': 11, 'z': 12})
do_something(1, 2)
do_something(1, 2)

在上面的代码中,函数do_something()有一个字典类型的默认参数c,默认是{'x':1,'y':2,'z':3}。

由于Python在定义函数时会默认生成一个函数常量,因此,同样的默认字典将以相同的常量值出现在所有函数调用中。同样,当一个函数在执行期间修改默认字典值时,所有函数调用都受到影响。

四、使用默认参数注意事项

Python默认参数可以为任何类型,并具有灵活性和可扩展性。但是,在使用默认参数时,需要注意以下几点:

1.默认参数不应该是可变的

默认参数在函数定义时被计算一次,该计算结果通常是保存到函数对象中的。如果默认参数是可变的,则每次使用函数时都可能更改该参数,通常是在函数的调用中更改。这可能会导致奇怪的行为。

例如,如果定义如下的print_list函数:

def print_list(lst=[], sep=' '):
    print(sep.join(str(i) for i in lst))

print_list()  # 输出: 
print_list([1, 2], ',')  # 输出: 1,2
print_list()  # 输出: 1,2

在 次调用print_list时,lst是一个空列表,它被保存在函数对象中