Python中的函数默认参数和关键字参数是什么?
Python是一种高级编程语言,它支持诸多的编程特征,其中函数是一项非常重要的特征。Python中的函数默认参数和关键字参数是编写函数时常用的技术,它们使得函数的参数传递更加灵活和方便。本文将详细介绍Python中的函数默认参数和关键字参数。
1. 函数默认参数
函数默认参数指的是在定义函数时,给函数参数提供默认值。当函数调用时,如果没有给该参数传值,则使用默认值。下面是一个简单的示例:
def greet(name, message="Welcome to our company!"):
print("Hello", name + ', ' + message)
greet("Jack")# 输出:Hello Jack, Welcome to our company!
greet("Peter", "How are you today?")# 输出:Hello Peter, How are you today?
在上述代码中,函数greet定义了两个参数,其中第二个参数message有一个默认值"Welcome to our company!"。如果在调用该函数时,我们不为该参数提供值,则会自动使用默认值。主程序中调用该函数分别传递了一个和两个参数,输出分别是"Hello Jack, Welcome to our company!"和"Hello Peter, How are you today?"。
需要注意的是,Python中函数默认参数只会在模块加载时被计算一次。因此,如果默认参数是一个可变的对象,例如列表或字典,那么每次调用函数时,都会使用同一个默认值。这时就需要使用懒惰赋值来生成默认参数的新实例。下面是一个示例:
def append_to_list(value, lis=[]):
lis.append(value)
print(lis)
append_to_list(1)# 输出:[1]
append_to_list(2)# 输出:[1, 2]
append_to_list(3)# 输出:[1, 2, 3]
在上述代码中,函数append_to_list的第二个参数是列表lis,它的默认值为[]。在第一次调用函数时,列表lis被初始化为空列表,然后将值1添加到该列表中。在第二次和第三次调用函数时,列表lis仍然是第一次调用时创建的。因此,如果要在每次调用时创建新的列表lis,需要使用懒惰赋值。下面是使用懒惰赋值的代码:
def append_to_list(value, lis=None):
if not lis:
lis = []
lis.append(value)
print(lis)
append_to_list(1)# 输出:[1]
append_to_list(2)# 输出:[2]
append_to_list(3)# 输出:[3]
在上述代码中,参数lis使用了懒惰赋值。如果lis的值为None,则创建一个新的空列表并将其赋值给lis。
2. 函数关键字参数
Python函数中的关键字参数是一种非常强大的特性,它使得函数调用时的参数传递更加灵活。关键字参数是指在调用函数时,使用参数名字来传递参数值。下面是一个示例:
def print_person_info(name, age, address):
print("Name:", name)
print("Age:", age)
print("Address:", address)
print_person_info(age=22, address='Beijing', name='John')
在上述代码中,函数print_person_info定义了三个参数,其中没有一个参数是默认参数。在函数调用时,我们使用了参数名字来指定每个参数的值。这样做的好处在于:
- 可以自定义传递参数的顺序;
- 可以跨越缺省参数;
- 可以使用默认值而不传递参数。
需要注意的是,Python函数中的关键字参数必须在位置参数之后传递。下面是一个示例:
def print_person_info(name, address, age=18):
print("Name:", name)
print("Address:", address)
print("Age:", age)
print_person_info('John', 'Beijing', age=22)# 输出:Name: John Address: Beijing Age: 22
print_person_info('John', age=22, address='Beijing')# 输出:Name: John Address: Beijing Age: 22
print_person_info(age=22, address='Beijing', name='John')# 报错:TypeError: print_person_info() missing 1 required positional argument: 'address'
在上述代码中,我们为函数print_person_info提供了三个参数,其中第三个参数age被设置为默认参数,其默认值为18。在第一次和第二次调用函数时,我们分别使用了不同的参数传递顺序。在第三次调用函数时,我们没有指定位置参数address,因此函数调用会报错。顺序参数必须出现在关键字参数之前。
3. 函数默认参数和关键字参数的使用场景
函数默认参数和关键字参数是Python中非常常用的技术,可以适用于很多应用场景。下面是一些常见的场景:
(1) 提供有用的缺省值
当函数有一些参数经常会使用同样的值时,可以使用默认参数来指定这个值。例如:
def add_numbers(x, y, z=0):
return x + y + z
print(add_numbers(1, 2))# 输出:3
print(add_numbers(1, 2, 3))# 输出:6
在上述代码中,我们定义了一个add_numbers函数,它有三个参数。其中最后一个参数z被指定为了默认参数,默认值为0。这样做的好处是,当调用add_numbers函数时,参数z可以省略不写,就会使用默认值0。
(2) 跨越缺省参数
函数默认参数有时候并不能满足我们的需求,有时候需要跨过缺省参数,直接指定后面的参数的值。例如:
def print_person_info(name, address='Beijing', age=18):
print("Name:", name)
print("Age:", age)
print("Address:", address)
print_person_info('John')
print_person_info('John', age=28)
在上述代码中,函数print_person_info定义了三个参数,其中前两个参数address和age都是默认参数。当我们不传递第二个和第三个参数时,他们就会使用默认值。当我们想跳过address参数,直接指定age参数的值时,便可以使用关键字参数来完成:
print_person_info('John', age=28)
(3) 函数重载
在Python中,不像其他语言那样支持函数的重载,但可以使用函数默认参数来模拟函数重载。例如:
def func(x, y=0):
result = x + y
print(result)
#定义函数的两种方式
func(1, 2)# 输出:3
func(4)# 输出:4
在上述代码中,我们使用了函数默认参数,同时定义了两个函数。这种技巧在代码复用方面非常有用,可实现多个函数功能的复用。
(4) 使用懒惰赋值来创建默认参数
在Python中,函数默认参数的赋值只会发生一次。如果默认参数是可变的,则会出现问题。例如:
def add_to_list(item, lis=[]):
lis.append(item)
return lis
print(add_to_list(1))# 输出:[1]
print(add_to_list(2))# 输出:[1, 2]
print(add_to_list(3))# 输出:[1, 2, 3]
在上述代码中,我们定义了一个add_to_list函数,它包含两个参数。其中第二个参数lis时一个列表,它的默认值为[]。当我们在调用函数时,函数添加了新的元素到这个列表中。这仅仅是因为Python只创建了一个[]对象,并在
