基于Python Numpy的成绩计算器代码纠错与优化方案咨询
成绩计算器代码纠错与优化技巧
一、代码纠错(针对你GitHub上的实现)
原代码存在逻辑冗余、输入未校验等问题,以下是修正后的完整实现:
import numpy as np def calculate_grades(scores): # 输入清洗与校验:统一转为NumPy数组,限制分数在0-100区间 scores = np.array(scores, dtype=np.float64) scores = np.clip(scores, 0, 100) # 用NumPy向量化操作替代循环判断,提升效率 grades = np.where(scores >= 90, 'A', np.where(scores >= 80, 'B', np.where(scores >= 70, 'C', np.where(scores >= 60, 'D', 'F')))) return grades # 测试示例 if __name__ == "__main__": student_scores = [85, 92, 58, 76, 105, -3] print(calculate_grades(student_scores))
修正点说明:
- 增加输入校验:通过
clip过滤超出0-100的无效分数,避免逻辑错误 - 替换循环判断:用
numpy.where链式操作实现向量化计算,比循环效率提升数倍 - 统一数据类型:将输入转为
float64,兼容整数、浮点数等多种输入格式
二、更简便的实现技巧
1. 用numpy.digitize快速映射等级
针对固定分数区间,digitize可以一次性完成分数到等级的映射,代码更简洁:
import numpy as np def calculate_grades_with_digitize(scores): scores = np.array(scores, dtype=np.float64) scores = np.clip(scores, 0, 100) # 定义左闭右开的分数区间边界 bins = [0, 60, 70, 80, 90, 101] grades = ['F', 'D', 'C', 'B', 'A'] # 获取每个分数对应的区间索引 indices = np.digitize(scores, bins, right=True) return np.array(grades)[indices - 1]
2. 封装为可复用工具类
将逻辑封装为类,支持自定义分数区间,方便后续扩展:
import numpy as np class GradeCalculator: def __init__(self, bins=None, grades=None): # 默认区间,可传入自定义值覆盖 self.bins = bins if bins else [0, 60, 70, 80, 90, 101] self.grades = grades if grades else ['F', 'D', 'C', 'B', 'A'] def calculate(self, scores): scores = np.array(scores, dtype=np.float64) scores = np.clip(scores, 0, 100) indices = np.digitize(scores, self.bins, right=True) return np.array(self.grades)[indices - 1] # 使用示例 calculator = GradeCalculator() print(calculator.calculate([75, 95, 55]))
3. 批量数据处理优化
如果处理CSV/Excel中的批量学生分数,结合pandas(基于NumPy)可直接对整列进行计算:
import pandas as pd import numpy as np # 读取学生分数数据 df = pd.read_csv('student_scores.csv') # 整列应用成绩计算逻辑 df['grade'] = np.where(df['score'] >=90, 'A', np.where(df['score']>=80, 'B', np.where(df['score']>=70, 'C', np.where(df['score']>=60, 'D', 'F'))))
内容的提问来源于stack exchange,提问作者Shreyas Kumar
相关产品推荐
相关产品推荐

