
目录
- 引
- 一、函数的核心作用:代码复用与模块化
- 二、函数的定义:用def关键字创建函数
-
- [1. 无参数函数:不需要输入的函数](#1. 无参数函数:不需要输入的函数)
- [2. 有参数函数:接收外部输入的函数](#2. 有参数函数:接收外部输入的函数)
- 三、函数的返回值:用return传递结果
-
- [1. 返回单个值](#1. 返回单个值)
- [2. 返回多个值](#2. 返回多个值)
- [3. 无return语句的函数](#3. 无return语句的函数)
- 四、函数的调用:执行函数并传递参数
-
- [1. 位置参数:按顺序传递参数](#1. 位置参数:按顺序传递参数)
- [2. 关键字参数:按名称传递参数](#2. 关键字参数:按名称传递参数)
- [3. 函数调用的执行流程](#3. 函数调用的执行流程)
- 五、综合案例:自定义数学工具函数
-
- [1. 案例代码实现](#1. 案例代码实现)
- [2. 案例解析](#2. 案例解析)
- 六、函数的参数默认值(进阶技巧)
- 七、总结与练习
- 练习题目(从易到难)
引
在编程中,当一段代码需要重复使用(如多次计算圆面积、反复验证用户输入),或者逻辑复杂需要单独封装时,函数就成为了必不可少的工具。函数是Python中组织代码的基本单元,它能将一段逻辑完整的代码块封装起来,实现"一次定义,多次调用",大幅提升代码的复用性和可读性。
本文将从函数的核心作用讲起,详细介绍函数的定义语法、调用方式和返回值处理,通过"Hello函数""加法函数""圆面积计算函数"等案例,帮助你掌握函数的基础用法,理解函数在模块化编程中的核心价值。
一、函数的核心作用:代码复用与模块化
想象一个场景:你需要在程序的10个不同位置打印"Hello, World!"。如果不使用函数,你需要重复编写10次print("Hello, World!")
;如果使用函数,只需定义一次打印逻辑,然后在10个位置调用即可。这就是函数的核心价值------代码复用。
函数的作用远不止于此:
- 模块化:将复杂程序拆分为多个功能独立的函数,每个函数专注于解决一个小问题,使程序结构清晰,便于调试和维护。
- 抽象逻辑 :通过函数名即可理解功能(如
calculate_area()
显然是计算面积的函数),无需关心内部实现细节。 - 参数化 :通过参数传递不同的值,使函数能处理多种情况(如
add(2,3)
和add(5,8)
用同一个函数实现不同计算)。
二、函数的定义:用def关键字创建函数
在Python中,函数通过def
关键字定义,基本语法结构如下:
python
def 函数名(参数列表):
"""函数文档字符串(可选,用于说明函数功能)"""
函数体(实现功能的代码块,必须缩进)
return 返回值(可选,用于返回结果)
- def:定义函数的关键字,必须放在函数名前。
- 函数名 :遵循Python命名规则(字母、数字、下划线组成,不能以数字开头),建议使用小写字母和下划线(如
say_hello
、calculate_area
),见名知意。 - 参数列表 :函数接收的输入值,多个参数用逗号分隔,无参数时留空(
()
)。 - 函数体:实现函数功能的代码,必须缩进(通常4个空格)。
- return :可选,用于将结果返回给调用者;若省略,函数默认返回
None
。 - 文档字符串 :用三引号包裹的说明文字,可通过
help(函数名)
查看,增强代码可读性。
1. 无参数函数:不需要输入的函数
当函数不需要外部输入即可完成功能时,参数列表为空。最典型的例子是打印固定信息的函数。
示例1:定义并调用无参数的say_hello函数
python
# 定义无参数函数
def say_hello():
"""打印Hello, World!"""
print("Hello, World!")
# 调用函数(函数名+括号)
say_hello() # 输出:Hello, World!
say_hello() # 再次调用,输出同样结果
执行流程解析:
def say_hello():
定义函数:创建一个名为say_hello
的函数,无参数,函数体为打印"Hello, World!"。say_hello()
调用函数:程序跳转到函数定义处,执行print
语句,然后回到调用位置继续执行。- 再次调用时,重复步骤2,实现代码复用。
2. 有参数函数:接收外部输入的函数
大多数情况下,函数需要根据外部输入的不同值执行不同操作,这时就需要定义参数。参数相当于函数内部的变量,其值由调用者传入。
示例2:定义并调用带参数的greet函数
python
# 定义带一个参数的函数
def greet(name):
"""向指定姓名的人打招呼"""
print(f"Hello, {name}!")
# 调用函数时传入参数
greet("Alice") # 输出:Hello, Alice!
greet("Bob") # 输出:Hello, Bob!
解析:
- 函数定义时,
name
是形式参数(简称"形参"),表示函数需要接收一个输入。 - 调用函数时,
"Alice"
和"Bob"
是实际参数 (简称"实参"),会被赋值给形参name
。 - 函数体通过
name
使用外部传入的值,实现"向不同人打招呼"的灵活功能。
示例3:带多个参数的函数(计算两数之和)
python
# 定义带两个参数的函数
def add(a, b):
"""计算两个数的和并返回"""
result = a + b
return result # 返回计算结果
# 调用函数,传入两个实参
sum1 = add(3, 5) # 实参3赋值给a,5赋值给b,返回8
sum2 = add(10, 20) # 返回30
print(sum1) # 输出:8
print(sum2) # 输出:30
解析:
- 函数
add
有两个形参a
和b
,分别接收两个加数。 - 函数体计算
a + b
,并通过return result
将结果返回给调用者。 - 调用时,返回值被赋值给变量
sum1
和sum2
,实现了"复用加法逻辑"的目的。
三、函数的返回值:用return传递结果
return
语句用于将函数的计算结果传递给调用者,是函数与外部通信的重要方式。它有以下特性:
- 返回单个值:直接返回一个数据(数字、字符串、列表等)。
- 返回多个值:用逗号分隔多个值,Python会自动将它们封装为元组返回。
- 终止函数执行 :
return
语句执行后,函数会立即结束,后续代码不再执行。
1. 返回单个值
最常见的用法,如示例3中的add
函数返回两数之和,或计算圆面积的函数返回面积值。
示例4:计算圆面积的函数(返回单个值)
python
import math # 导入数学模块,用于获取π值
def circle_area(radius):
"""根据半径计算圆的面积(πr²)"""
if radius < 0:
print("错误:半径不能为负数")
return None # 返回None表示无效结果
area = math.pi * radius **2
return area # 返回面积值
# 调用函数
area1 = circle_area(2) # 半径为2的圆面积
area2 = circle_area(-1) # 无效半径
print(f"半径为2的圆面积:{area1:.2f}") # 输出:12.57(保留2位小数)
print(f"无效半径的返回值:{area2}") # 输出:None
解析:
- 函数首先判断半径是否为负数,若无效则返回
None
(表示"无有效结果")。 - 有效时计算面积并返回,调用者通过变量接收结果并使用。
return
不仅返回值,还会终止函数(若半径为负,return None
后不会执行面积计算)。
2. 返回多个值
当函数需要返回多个相关结果时(如同时返回两数之和与乘积),可在return
后用逗号分隔多个值,调用者可用多个变量接收(自动解包)。
示例5:返回多个值的函数(求和与乘积)
python
def calculate(a, b):
"""返回a与b的和、差、积"""
sum_ab = a + b
diff_ab = a - b
product_ab = a * b
return sum_ab, diff_ab, product_ab # 返回多个值(自动封装为元组)
# 调用函数,用多个变量接收返回值
sum_val, diff_val, product_val = calculate(5, 3)
print(f"和:{sum_val}") # 输出:8
print(f"差:{diff_val}") # 输出:2
print(f"积:{product_val}") # 输出:15
# 也可以用单个变量接收(得到元组)
results = calculate(4, 2)
print(f"返回的元组:{results}") # 输出:(6, 2, 8)
解析:
return sum_ab, diff_ab, product_ab
实际返回的是一个元组(sum_ab, diff_ab, product_ab)
。- 调用时,
sum_val, diff_val, product_val = ...
会自动解包元组,将三个值分别赋值给变量。 - 若用单个变量接收(如
results
),则变量会存储整个元组,可通过索引访问其中的值(如results[0]
获取和)。
3. 无return语句的函数
若函数没有return
语句,或return
后没有值,则默认返回None
(Python中表示"无"的特殊值)。
python
def print_greeting():
print("Welcome!") # 没有return语句
result = print_greeting()
print(f"函数返回值:{result}") # 输出:None
四、函数的调用:执行函数并传递参数
定义函数后,需要通过"函数名(参数)"的方式调用才能执行其功能。调用时,实参的数量和类型需与函数定义的形参匹配(除非使用默认参数等高级特性)。
1. 位置参数:按顺序传递参数
最常用的参数传递方式,实参与形参按位置一一对应。
python
def describe_person(name, age):
"""描述一个人的姓名和年龄"""
print(f"{name}今年{age}岁")
# 位置参数:第一个实参给name,第二个给age
describe_person("张三", 25) # 输出:张三今年25岁
注意:位置参数必须按顺序传递,否则会导致逻辑错误:
python
# 错误示例:参数顺序颠倒
describe_person(25, "张三") # 输出:25今年张三岁(逻辑错误)
2. 关键字参数:按名称传递参数
为避免位置错误,可在调用时指定"形参名=实参",明确参数对应关系,参数顺序可任意。
python
# 关键字参数:明确指定参数对应的形参
describe_person(age=25, name="张三") # 输出:张三今年25岁(顺序颠倒但结果正确)
适用场景:当函数参数较多时,关键字参数能提高代码可读性,避免因参数顺序错误导致的bug。
3. 函数调用的执行流程
函数调用时,程序的执行流程会发生跳转,具体步骤如下:
- 调用函数时,计算实参的值,传递给对应的形参。
- 程序跳转到函数定义处,执行函数体中的代码。
- 遇到
return
语句时,将返回值传递给调用者,程序跳转回调用位置。 - 若函数体执行完毕仍未遇到
return
,则返回None
,程序跳转回调用位置。
示例6:函数调用流程演示
python
def multiply(x, y):
print("开始计算乘积...")
result = x * y
print("计算结束,准备返回结果")
return result
print("程序开始")
product = multiply(3, 4) # 调用函数
print(f"3×4的结果是:{product}")
print("程序结束")
执行流程与输出:
程序开始
开始计算乘积...
计算结束,准备返回结果
3×4的结果是:12
程序结束
解析:
- 程序先执行
print("程序开始")
。 - 调用
multiply(3,4)
时,跳转到函数内,执行打印和计算。 return result
将12返回给product
,程序跳转回调用处。- 继续执行后续的
print
语句。
五、综合案例:自定义数学工具函数
我们通过一个"数学工具"案例,综合应用函数的定义、调用和返回值,实现三个功能:计算绝对值、判断奇偶性、求两数中较大值。
1. 案例代码实现
python
def absolute_value(num):
"""计算一个数的绝对值"""
if num < 0:
return -num # 负数的绝对值是其相反数
else:
return num # 非负数的绝对值是自身
def is_even(num):
"""判断一个数是否为偶数,返回布尔值"""
return num % 2 == 0 # 能被2整除则为偶数
def max_of_two(a, b):
"""返回两个数中较大的那个数"""
if a > b:
return a
else:
return b
# 测试函数
if __name__ == "__main__":
# 测试绝对值函数
print(f"-5的绝对值:{absolute_value(-5)}") # 输出:5
print(f"3的绝对值:{absolute_value(3)}") # 输出:3
# 测试奇偶性判断
print(f"6是否为偶数:{is_even(6)}") # 输出:True
print(f"7是否为偶数:{is_even(7)}") # 输出:False
# 测试求最大值
print(f"4和9中较大的是:{max_of_two(4, 9)}") # 输出:9
print(f"10和5中较大的是:{max_of_two(10, 5)}") # 输出:10
2. 案例解析
- 函数封装:每个函数专注于单一功能,代码逻辑清晰,可独立测试和复用。
- 返回值设计 :
absolute_value
返回数值(绝对值)。is_even
返回布尔值(True
/False
),适合直接用于条件判断。max_of_two
返回两个数中的较大值,便于后续计算。
- 测试代码 :
if __name__ == "__main__":
确保测试代码仅在直接运行该文件时执行,当文件被导入为模块时不执行,符合模块化设计原则。
六、函数的参数默认值(进阶技巧)
为了让函数更灵活,Python允许为参数设置默认值:当调用者未传递该参数时,函数使用默认值;若传递了参数,则覆盖默认值。
python
def greet(name="Guest"):
"""向指定姓名的人打招呼,默认是Guest"""
print(f"Hello, {name}!")
greet("Alice") # 传递参数,输出:Hello, Alice!
greet() # 未传递参数,使用默认值,输出:Hello, Guest!
注意:带默认值的参数必须放在无默认值参数的后面(否则会报错):
python
# 正确:无默认值参数在前,有默认值在后
def introduce(name, age=18):
print(f"{name}今年{age}岁")
# 错误:有默认值参数不能放在无默认值参数前
# def introduce(age=18, name):
# print(f"{name}今年{age}岁") # SyntaxError
七、总结与练习
函数是Python编程的基础组件,本文核心知识点:
- 定义语法 :
def 函数名(参数): 函数体 return 返回值
。 - 核心作用:代码复用(避免重复编写)、模块化(拆分复杂逻辑)。
- 参数传递:位置参数(按顺序)和关键字参数(按名称),确保实参与形参匹配。
- 返回值 :
return
可返回单个值或多个值(自动封装为元组),无return
则返回None
。 - 执行流程:调用时跳转至函数定义,执行后返回调用位置。
练习题目(从易到难)
- 定义一个无参数函数
print_menu()
,打印餐厅菜单(至少3个菜品)。 - 定义一个带参数的函数
calculate_rect_area(length, width)
,返回长方形的面积。 - 定义一个函数
get_user_info(name, age, city)
,返回一个包含这三个信息的字典。 - 定义一个函数
temperature_convert(celsius, target_unit)
,将摄氏度转换为华氏度(默认)或开尔文度,返回转换后的值(华氏度公式:celsius×1.8+32;开尔文度公式:celsius+273.15)。
通过这些练习,你将逐步掌握函数的灵活应用,为后续学习函数的高级特性(如可变参数、匿名函数)打下基础。