Python · Day 13

函数综合:
成绩分析报告

第十三天,我继续用函数处理列表。从平均分和最高分两个单独任务出发,最后把累计、比较、空列表判断和字典组合成一份完整的成绩分析报告。

计算一组成绩的平均分

计算平均分要先把所有成绩累加,再除以成绩数量。total 保存不断变化的总分,len(scores) 得到列表里成绩的数量。

day13.py
def calculate_average(scores):              # scores接收成绩列表
    if len(scores) == 0:                     # 先判断列表是否为空
        return 0                              # 空列表直接返回0并结束函数
    total = 0                                   # 总分从0开始累计
    for score in scores:                    # score依次接收每个成绩
        total = total + score                   # 把当前成绩加入总分
    average = total / len(scores)               # 总分除以成绩数量
    return average                            # 返回计算出的平均分

student_scores = [80, 90, 70]                 # 创建成绩列表
result = calculate_average(student_scores)    # 调用函数并接收结果
print("平均分是:", result)                  # 输出80.0

这里输出的是 80.0。因为 Python 的 / 是普通除法,即使结果刚好是整数,也会得到带小数点的浮点数。

先处理空列表

如果列表是 [],那么 len(scores) 等于 0。直接计算 total / len(scores) 就会变成除以 0,因此函数开头先判断空列表并返回 0。

return 0 不只是送出结果,也会立刻终止函数。空列表进入这个分支后,后面的循环和除法都不会执行。

不用 0 猜最高分

寻找最高分时,先把列表中的第一个真实成绩 scores[0] 交给 highest,再让其余成绩逐个与它比较。这样即使列表中的数据都是负数,程序也能正确工作。

highest_score.py
def find_highest(scores):                  # 定义寻找最高分的函数
    if len(scores) == 0:                    # 空列表没有可比较的成绩
        return 0                             # 直接返回0并结束函数
    highest = scores[0]                         # 先把第一个真实成绩当作最高分
    for score in scores:                   # 依次查看列表中的每个成绩
        if score > highest:                   # 当前成绩更高时
            highest = score                    # 更新已经找到的最高分
    return highest                            # 全部比较后返回最高分

student_scores = [80, 90, 70, 95, 85]        # 创建成绩列表
result = find_highest(student_scores)         # 调用函数并接收最高分
print("最高分是:", result)                 # 输出95

我已经能准确追踪这个过程:例如 65 遇到 88 时更新为 88,接着 88 遇到 72 时保持不变,最终由 return 送出已经找到的最高分。

一次返回完整成绩报告

最后的小项目把前面的思路合在一个函数里。在同一次循环中,程序一边累加总分,一边比较最高分;循环结束后再计算平均分。

score_report.py
def analyze_scores(scores):                  # 定义成绩分析函数
    if len(scores) == 0:                     # 先处理空列表
        return {"total": 0, "average": 0, "highest": 0} # 返回空报告
    total = 0                                   # 总分累计值从0开始
    highest = scores[0]                         # 最高分先取第一个成绩
    for score in scores:                    # 逐个处理每项成绩
        total = total + score                   # 累加当前成绩
        if score > highest:                  # 当前成绩更高时
            highest = score                    # 更新最高分
    average = total / len(scores)               # 计算平均分
    return {"total": total, "average": average, "highest": highest} # 返回字典

student_scores = [80, 90, 70, 95, 85]        # 创建成绩列表
result = analyze_scores(student_scores)       # result接收返回的字典
print("总分是:", result["total"])          # 输出420
print("平均分是:", result["average"])      # 输出84.0
print("最高分是:", result["highest"])      # 输出95

函数返回的是一个字典。result["average"] 根据键 "average" 取出对应的值 84.0;这个值是浮点数,而不是整数。

今天的小测与订正

  • analyze_scores() 返回的是字典
  • result["average"] 得到的是浮点数 84.0
  • 空列表会进入第一个 if,随后被 return 终止,后面的循环和除法不会执行

今天真正弄懂了什么

  • 使用总分除以 len(scores) 可以得到平均分
  • 普通除法 / 会得到浮点数
  • 函数要先处理空列表,避免出现除零错误
  • 寻找最高分时,应从列表中的第一个真实值开始比较
  • 一个循环可以同时完成累计和比较两项工作
  • 函数可以返回字典,把多个结果一起送到函数外部
  • 通过字典的键,可以准确取出某一项分析结果

今天不再只让函数返回一个数字,而是让它完成一整套分析,并把每项结果清楚地命名。这是把多个基础知识真正组合起来的一次练习。