Python 条件与循环:统计有效学习记录和达标天数
把一周学习分钟数转换成可核对的统计结果,练习 if、for、continue 和 enumerate,并明确无效数据与未达标数据的区别。
本节目标
把一周学习分钟数转换成可核对的统计结果,练习 if、for、continue 和 enumerate,并明确无效数据与未达标数据的区别。
知识与使用场景
一周记录中可能混入负数。统计之前先规定规则:非负整数是有效分钟数,负数代表需要核查的记录,达到 30 分钟算达标。本例数据写在代码里,所以不额外实现字符串解析。
for 按顺序访问列表元素,enumerate 同时提供序号。把 start 设为 1 后,显示的日序号从第 1 天开始,便于与实际记录对应。continue 用来结束当前这一轮,使无效记录不进入后面的累计。
统计时要把三件事分开:累计有效分钟数、计数有效记录、收集达标日。一天只有 10 分钟虽然不达标,仍应计入平均值。若把未达标日全部丢弃,得到的就不是所有有效日的平均学习时长。
完整示例
records = [20, 40, -5, 30, 0]
total = 0
valid_count = 0
qualified = []
for day, minutes in enumerate(records, start=1):
if minutes < 0:
continue
total += minutes
valid_count += 1
if minutes >= 30:
qualified.append(day)
average = total / valid_count if valid_count else 0
print(f"有效记录:{valid_count},总分钟:{total}")
print(f"达标日:{qualified}")
print(f"日均:{average:.1f} 分钟")预期结果
有效记录:4,总分钟:90
达标日:[2, 4]
日均:22.5 分钟运行与逐步理解
把代码保存为 lesson.py 后运行。第 3 条记录为 -5,continue 使它跳过累计与达标判断。第 5 条记录为 0,通过非负验证,但不满足 30 分钟门槛,因此只增加有效记录数量。
遍历结束后再计算平均数,这样分母代表整份数据。条件表达式保证有效记录为零时不发生除零;这里选择显示 0,是演示程序的规则。面向用户的报表也可以显示“暂无数据”,以免把无记录误解成真实零时长。
若需要筛选结果,优先构造一个新列表,避免一边遍历原列表一边删除元素。后者会移动索引,让本应访问的下一条记录被跳过。
常见问题与边界
minutes > 30会把恰好 30 分钟排除,与“达到 30 分钟”不一致。- valid_count 应在验证通过后增加,不能直接使用原列表长度。
- break 会结束整个循环,不能代替这里的 continue。
- 空列表和全部无效的记录都需要明确的平均值展示规则。
动手练习
改用 [30, -1, 60],再改用空列表,分别预测有效条数、总时长、达标日和平均值。
参考答案
第一组有 2 条有效记录,总计 90 分钟,达标日为 [1, 3],日均 45.0 分钟。空列表得到 0 条有效记录、总分钟 0、达标日 []、日均 0.0 分钟。空数据展示为零是本例约定,不代表发生过真实学习。
文章回复
0 条公开回复