
本文介绍如何使用循环与条件校验,确保用户输入的 5 个成绩全部落在合法区间 [0, 20] 内,拒绝非法值并要求重输,避免错误数据污染数组。
本文介绍如何使用循环与条件校验,确保用户输入的 5 个成绩全部落在合法区间 [0, 20] 内,拒绝非法值并要求重输,避免错误数据污染数组。
在实际教学或成绩管理系统中,数据有效性是首要前提。原始代码虽能接收 5 个输入,但缺乏对单个成绩的实时校验机制——一旦用户输入超过 20 的数值(如 23、25),程序仍会无条件存入数组,导致后续统计(如 np.amin/np.amax)结果失真。正确的做法是在每次赋值前主动拦截非法输入,而非依赖事后检查。
✅ 推荐实现:嵌套 for + while 验证循环
以下为健壮、清晰且符合初学者理解习惯的改进方案:
import numpy as np # 初始化空列表(更灵活、更 pythonic) grades = [] # 循环 5 次,每次确保输入合法后才追加 for i in range(5): valid_input = False while not valid_input: try: score = float(input(f"请输入第 {i+1} 个成绩(0–20): ")) if 0 <= score <= 20: grades.append(score) valid_input = True else: print("❌ 错误:成绩必须在 0 到 20 之间(含边界),请重新输入。") except ValueError: print("❌ 错误:请输入有效的数字。") # 转为 NumPy 数组用于高效计算 grade_Array = np.array(grades) print(f"n✅ 成绩列表: {grade_array}") print(f"最低分: {np.min(grade_array):.1f}") print(f"最高分: {np.max(grade_array):.1f}")
? 关键设计说明:
- while not valid_input:形成“输入—验证—通过/重试”闭环,直到用户输入合法为止;
- try…except:捕获非数字输入(如 “abc” 或空回车),防止 ValueError 中断程序;
- 0 :明确包含边界(0 和 20 均为有效成绩),符合题目要求;
- 使用 list.append() 替代预分配 np.zeros(5):避免初始零值干扰(例如若用户中途出错退出,零值会被误计入统计);
⚠️ 注意事项
- ❌ 不要仅校验 grade[0] 后就放行后续输入(原问题中 if grade[0] and grade[item]
- ❌ 避免用 np.zeros(5) 预填充后覆盖——若某次输入失败而未更新对应位置,残留的 0.0 将扭曲 min() 结果;
- ✅ 若需固定长度数组,可在全部验证完成后用 np.array(grades) 转换,兼顾安全性与后续数值运算需求。
? 总结
数据录入阶段的防御性编程至关重要。通过「循环内嵌验证」模式,我们以最小认知负担实现了强健性:每项输入独立校验、错误即时反馈、非法值绝不落库。这不仅解决了当前成绩范围约束问题,更建立了一种可复用于密码强度检测、邮箱格式验证等场景的通用输入守卫范式。