DevCN
菜单
全部文章快讯开发深度热点

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 分钟。空数据展示为零是本例约定,不代表发生过真实学习。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。