函数综合:
成绩分析报告
第十三天,我继续用函数处理列表。从平均分和最高分两个单独任务出发,最后把累计、比较、空列表判断和字典组合成一份完整的成绩分析报告。
计算一组成绩的平均分
计算平均分要先把所有成绩累加,再除以成绩数量。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)可以得到平均分 - 普通除法
/会得到浮点数 - 函数要先处理空列表,避免出现除零错误
- 寻找最高分时,应从列表中的第一个真实值开始比较
- 一个循环可以同时完成累计和比较两项工作
- 函数可以返回字典,把多个结果一起送到函数外部
- 通过字典的键,可以准确取出某一项分析结果
今天不再只让函数返回一个数字,而是让它完成一整套分析,并把每项结果清楚地命名。这是把多个基础知识真正组合起来的一次练习。