1. 案例背景
我们将用一个简化版的学生成绩管理系统来演示:
-
如何定义函数(参数、返回值)
-
如何使用不同类型的参数(位置参数、关键字参数、可变参数)
-
作用域(全局与局部变量)
-
匿名函数(
lambda
) -
闭包
-
常用高阶函数(
map
、filter
、sorted
、reduce
)
目标功能:
-
添加学生及成绩
-
查询成绩
-
计算平均分
-
查找优秀学生
-
排序学生成绩
python
from functools import reduce
# =========================
# 全局变量 - 模拟数据库
# =========================
students_data = {} # { "姓名": [语文, 数学, 英语] }
# =========================
# 基础函数与参数示例
# =========================
def add_student(name, *scores):
"""
功能说明:
添加一个学生及其成绩到系统中。
该函数使用了可变参数 *scores 来接收任意数量的成绩(通常是多门科目),
并将其存储到全局字典 students_data 中。
使用场景:
需要在系统中录入新学生时调用。
"""
if name in students_data:
print(f"学生 {name} 已存在,添加失败。")
return False
students_data[name] = list(scores)
print(f"学生 {name} 添加成功!")
return True
def get_student_score(name):
"""
功能说明:
查询某个学生的成绩列表。
如果学生不存在,则返回 None。
使用场景:
需要查看单个学生的所有科目成绩时调用。
"""
return students_data.get(name, None)
# =========================
# 作用域示例
# =========================
def update_score(name, subject_index, new_score):
"""
功能说明:
修改指定学生某一科目的成绩。
该函数演示了如何在函数内部修改全局变量 students_data,
体现了 Python 中全局作用域与局部作用域的关系。
使用场景:
成绩录入错误或学生成绩需要更新时调用。
"""
if name in students_data and 0 <= subject_index < len(students_data[name]):
students_data[name][subject_index] = new_score
print(f"{name} 的成绩已更新!")
else:
print("学生不存在或科目索引错误。")
# =========================
# 匿名函数 & 高阶函数
# =========================
def calculate_average(name):
"""
功能说明:
计算某个学生的平均分。
使用 reduce 和 lambda 进行成绩求和,并计算平均值。
使用场景:
在成绩分析、排序、筛选优秀学生时调用。
"""
scores = students_data.get(name)
if not scores:
return None
avg = reduce(lambda x, y: x + y, scores) / len(scores)
return round(avg, 2)
def get_top_students(min_score=85):
"""
功能说明:
筛选出平均分大于等于 min_score 的学生名单。
使用 filter + lambda 实现。
使用场景:
需要快速获取优秀学生名单时调用。
"""
return list(filter(lambda name: calculate_average(name) >= min_score, students_data.keys()))
def sort_students(by_avg=True, reverse=True):
"""
功能说明:
对学生进行排序,可选择按平均分或成绩列表排序。
默认按平均分从高到低排序。
使用 sorted + lambda 实现。
使用场景:
在成绩分析报告中对学生进行排名时调用。
"""
return sorted(
students_data.keys(),
key=lambda name: calculate_average(name) if by_avg else students_data[name],
reverse=reverse
)
# =========================
# 闭包示例
# =========================
def score_query_maker(subject_index):
"""
功能说明:
创建一个闭包函数,用于查询指定科目的成绩。
外部函数接收科目索引,返回的内部函数根据学生姓名返回该科目的分数。
使用场景:
当需要重复查询某一科目的成绩时,可以生成专用的查询函数,提高效率。
"""
def query(name):
scores = students_data.get(name)
if not scores:
return None
return scores[subject_index]
return query
# =========================
# 测试流程
# =========================
if __name__ == "__main__":
# 添加学生
add_student("小明", 88, 92, 79)
add_student("小红", 95, 90, 93)
add_student("小刚", 70, 65, 80)
# 查询成绩
print("小红成绩:", get_student_score("小红"))
# 更新成绩
update_score("小明", 2, 85) # 改英语成绩
# 计算平均分
print("小明平均分:", calculate_average("小明"))
# 查找优秀学生
print("优秀学生:", get_top_students(85))
# 排序学生
print("按平均分排序:", sort_students())
# 使用闭包查询某科成绩
query_math = score_query_maker(1) # 数学
print("小红的数学成绩:", query_math("小红"))
知识点总结与使用场景
1. 函数定义与调用
作用:
-
将代码结构化,提升可读性与可维护性
-
复用逻辑,减少重复代码
使用场景:
-
需要实现特定功能的代码块(如
add_student
添加学生、update_score
修改成绩) -
模块化项目开发
2. 参数类型(位置参数、关键字参数、可变参数)
作用:
-
灵活传递数据给函数
-
使函数更通用,可适配不同调用需求
使用场景:
-
位置参数 :严格按照顺序传递数据(如
update_score
) -
关键字参数 :调用时可读性更高(如
min_score=85
) -
可变参数 :接收不定数量的值(如
add_student(*scores)
录入多科成绩)3. 返回值
作用:
-
将函数处理结果传递给调用方
-
可作为后续数据处理的输入
使用场景:
-
查询功能(如
get_student_score
返回学生成绩列表) -
计算功能(如
calculate_average
返回平均分)
4. 作用域(全局变量与局部变量)作用:
-
控制变量的可访问范围
-
避免变量命名冲突
使用场景:
-
全局变量 :存储共享数据(如
students_data
) -
局部变量 :仅在函数内部使用(如
scores
)
5. 匿名函数(lambda
)
作用:
-
快速定义简短函数
-
适用于一次性、临时逻辑处理
使用场景:
-
数据处理中的映射、过滤、排序(如
lambda name: calculate_average(name)
) -
不需要为函数取名的场合
6. 闭包
作用:
-
让内部函数记住外部函数的变量环境,即使外部函数已执行完毕
-
便于封装特定功能的函数工厂
使用场景:
-
定制化功能生成(如
score_query_maker
生成专门查询某科成绩的函数) -
数据持久化到函数内部状态
7. 高阶函数(map
、filter
、reduce
、sorted
)
作用:
-
接收函数作为参数,实现更简洁的数据处理逻辑
-
提高代码可读性与表达能力
使用场景:
-
map:批量转换数据(如批量计算分数)
-
filter :筛选数据(如
get_top_students
筛选优秀学生) -
reduce :聚合计算(如
calculate_average
计算总分) -
sorted :排序(如
sort_students
按平均分排名)