综合案例:Python 函数知识整合 — 学生成绩管理系统

1. 案例背景

我们将用一个简化版的学生成绩管理系统来演示:

  • 如何定义函数(参数、返回值)

  • 如何使用不同类型的参数(位置参数、关键字参数、可变参数)

  • 作用域(全局与局部变量)

  • 匿名函数(lambda

  • 闭包

  • 常用高阶函数(mapfiltersortedreduce

目标功能:

  1. 添加学生及成绩

  2. 查询成绩

  3. 计算平均分

  4. 查找优秀学生

  5. 排序学生成绩

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. 高阶函数(mapfilterreducesorted

作用

  • 接收函数作为参数,实现更简洁的数据处理逻辑

  • 提高代码可读性与表达能力

使用场景

  • map:批量转换数据(如批量计算分数)

  • filter :筛选数据(如 get_top_students 筛选优秀学生)

  • reduce :聚合计算(如 calculate_average 计算总分)

  • sorted :排序(如 sort_students 按平均分排名)

相关推荐
朱嘉鼎20 分钟前
C语言之可变参函数
c语言·开发语言
yanxing.D21 分钟前
OpenCV轻松入门_面向python(第六章 阈值处理)
人工智能·python·opencv·计算机视觉
JJJJ_iii1 小时前
【机器学习01】监督学习、无监督学习、线性回归、代价函数
人工智能·笔记·python·学习·机器学习·jupyter·线性回归
北冥湖畔的燕雀3 小时前
C++泛型编程(函数模板以及类模板)
开发语言·c++
Python图像识别4 小时前
71_基于深度学习的布料瑕疵检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
python·深度学习·yolo
QX_hao5 小时前
【Go】--map和struct数据类型
开发语言·后端·golang
你好,我叫C小白5 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
千码君20165 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
淮北4946 小时前
windows安装minicoda
windows·python·conda
Evand J6 小时前
【MATLAB例程】基于USBL和DVL的线性回归误差补偿,对USBL和DVL导航数据进行相互补偿,提高定位精度,附代码下载链接
开发语言·matlab·线性回归·水下定位·usbl·dvl