当我们编写 Python 程序时,经常需要用到函数来封装一些可重用的代码块。Python 函数定义非常简单,可以使用 def
关键字来定义一个函数。
Python 函数的定义
Python 函数的定义格式如下:
def function_name(parameters):
"""函数文档字符串"""
function body
return [expression]
其中,
def
是 Python 中定义函数的关键字;function_name
表示函数名称;parameters
为函数的参数列表,多个参数用逗号分隔;- 函数文档字符串用于描述函数的功能和参数,通过
__doc__
可以查看函数的文档字符串; function body
是函数的代码块,它以一个冒号起始,并通过缩进来表示代码块,函数体中的语句块必须要有相同的缩进级别;return
语句可选,用于返回函数的结果,如果不写,则返回None
。
下面是一个简单的 Python 函数示例,用来计算两个数字的和:
def sum(a, b):
"""计算两个数的和"""
return a + b
在上述代码中,sum
表示函数名称,a
和 b
表示函数的参数列表,函数体中代码 a + b
用于计算两个数字的和,"""计算两个数的和"""
用于描述函数的功能和参数。
Python 函数的调用
在定义完 Python 函数后,我们可以通过它来进行操作。Python 函数的调用非常简单,只需要写出函数名和对应的参数即可。
result = sum(1, 2)
print(result)
在上述代码中,我们定义了一个名为 result
的变量来存储函数 sum
的返回结果,并通过 print
打印出来。
Python 函数的参数传递
在 Python 中,函数参数可以分为位置参数和关键字参数。位置参数是最常见的参数类型,它们在调用函数时按照函数定义的顺序传递给函数。关键字参数则是指在函数调用时,通过指定参数名来传递参数值。
位置参数
位置参数在函数调用时,必须按照函数定义的参数列表以相同的顺序传递。例如下面的代码:
def print_score(name, score):
"""打印学生成绩"""
print(f"{name}的成绩是{score}")
print_score("小明", 85)
在上述代码中,函数 print_score
的参数列表为 name
和 score
,在函数调用时,我们按照 name
和 score
参数的顺序传递了 “小明” 和 85 两个位置参数。
关键字参数
关键字参数则是指在函数调用时,通过指定参数名来传递参数值。例如下面的代码:
def print_score(name, score):
"""打印学生成绩"""
print(f"{name}的成绩是{score}")
print_score(name="小明", score=85)
在上述代码中,我们在函数调用时,通过指定参数名 name
和 score
来传递参数值。关键字参数的顺序可以任意。
默认参数
默认参数用于为函数的参数提供默认值,如果在函数调用时没有传递该参数,则使用默认值。例如下面的代码:
def print_score(name, score=60):
"""打印学生成绩"""
print(f"{name}的成绩是{score}")
print_score("小明")
在上述代码中,我们定义了一个名为 score
的默认参数,它的默认值是 60。在调用函数 print_score
时,我们只传递了一个 name
参数,并没有传递 score
参数,此时函数 print_score
会使用默认值 60。
可变参数
在 Python 中,我们可以通过定义可变参数来接受任意数量的位置参数或关键字参数。
*args
通过使用 *args
可以接受任意数量的位置参数。例如下面的代码:
def sum(*args):
"""计算任意数量的数的和"""
total = 0
for arg in args:
total += arg
return total
print(sum(1, 2, 3))
在上述代码中,我们定义了一个名为 *args
的参数,它表示接受任意数量的位置参数。在调用函数 sum
时,我们传递了 3 个位置参数,此时函数 sum
会将这 3 个参数相加并返回结果。
**kwargs
通过使用 **kwargs
可以接受任意数量的关键字参数。例如下面的代码:
def print_info(name, **kwargs):
"""打印任意数量的信息"""
print(f"姓名:{name}")
for key, value in kwargs.items():
print(f"{key}:{value}")
print_info("小明", age=18, gender="男")
在上述代码中,我们定义了一个名为 **kwargs
的参数,它表示接受任意数量的关键字参数。在调用函数 print_info
时,我们传递了 age
和 gender
两个关键字参数,此时函数 print_info
会打印出这两个参数的值。
示例1:使用函数求矩形面积
下面我们来举一个例子,在该例子中,我们将定义一个名为 calc_area
的函数,用来计算矩形的面积。该函数将接受矩形的宽度和高度两个参数,并通过公式 width * height
来计算矩形的面积。
def calc_area(width, height):
"""计算矩形的面积"""
return width * height
width = 3
height = 4
area = calc_area(width, height)
print(f"宽度为{width},高度为{height}的矩形面积是{area}。")
在上述代码中,我们定义了一个名为 calc_area
的函数,它接受矩形的宽度和高度两个参数,并返回矩形的面积。在调用函数 calc_area
时,我们传递了宽度为 3,高度为 4 两个参数,函数将使用公式 width * height
计算矩形的面积,并返回计算结果。最后我们将矩形的宽度、高度和面积一起打印出来。
示例2:将列表中的偶数移至一个新列表中
下面我们来示例一个更复杂的函数,它可以将列表中的偶数移至一个新列表中。该函数将接受一个列表作为参数,并将其中的偶数移至新列表中返回。
def filter_even_numbers(numbers):
"""过滤列表 numbers 中的偶数并返回"""
even_numbers = []
for number in numbers:
if number % 2 == 0:
even_numbers.append(number)
return even_numbers
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter_even_numbers(numbers)
print(f"原列表为{numbers},偶数列表为{even_numbers}")
在上述代码中,我们定义了一个名为 filter_even_numbers
的函数,它接受一个列表作为参数,并将其中的偶数移至新列表中返回。在调用函数 filter_even_numbers
时,我们传递了一个列表的参数,函数将遍历该列表,并针对其中的每个元素进行处理。如果该元素是偶数,则将其添加至新列表 even_numbers
中。最后我们将原来的列表和新列表一起打印出来。