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

Python中的函数默认参数和关键字参数是什么?

发布时间:2023-06-15 16:05:12

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只创建了一个[]对象,并在