Python函数中参数的默认值是什么
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是一个空列表,它被保存在函数对象中
