我正在做一个作业,我想根据成绩等级和学生的GPA归还字母等级。
我能够成功创建一个计算学生的GPA并将其返回的函数,但是在返回相应字母等级时遇到了麻烦。
这是我到目前为止的代码:
def get_gpa(scale, points):
for (key, data) in scale.items():
if points <= data['high'] and points >= data['low']:
return data['gpa']
return 0
def calculate_gpa(scale, student):
totalCredits = 0
gpa = 0
for i in student['classes']:
classGpa = get_gpa(scale, i['points'])
totalCredits += i['credits']
gpa += (classGpa) * (i['credits'])
return gpa / totalCredits
def get_letter_grade_v1(grade_scale, gpa):
for (key, data) in grade_scale.items():
if gpa <= data['high'] and gpa >= data['low']:
return key
else:
return 'D'
这是比例尺:
grade_scale = {
"A+": {"low": 96, "high":100,"gpa":4.0},
"A" : {"low": 93, "high":95, "gpa":4.0},
"A-": {"low": 90, "high":92, "gpa":3.7},
"B+": {"low": 86, "high":89, "gpa":3.3},
"B" : {"low": 83, "high":85, "gpa":3.0},
"B-": {"low": 80, "high":82, "gpa":2.7},
"C+": {"low": 76, "high":79, "gpa":2.3},
"C" : {"low": 73, "high":75, "gpa":2.0},
"C-": {"low": 70, "high":72, "gpa":1.7},
}
例如,如果学生的GPA为3.47,则get_letter_grade_v1函数应返回“ B +”。
student123 = {
"id": "smith123",
"classes" : [
{"name": "stats 100", "points": 88, "credits": 4},
{"name": "cs 101", "points": 92, "credits": 3},
{"name": "history 101", "points": 91, "credits": 3},
{"name": "Pysch 201", "points": 86, "credits": 4},
]
}
当我为每个班级测试该学生的成绩时,它实际上应该返回“ B +”时仍会继续返回“ D”。谁能指出我的代码出了什么问题或提供一些提示?谢谢!
答案 0 :(得分:1)
您的问题是,您仅查看一个可能的成绩后就宣布失败:无论学生的成绩如何,您都将在for
循环的第一次迭代后返回结果。
def get_letter_grade_v1(grade_scale, gpa):
for (key, data) in grade_scale.items():
if gpa <= data['high'] and gpa >= data['low']:
return key
else:
return 'D'
相反,您必须等到所有检查失败:
def get_letter_grade_v1(grade_scale, gpa):
for (key, data) in grade_scale.items():
if gpa <= data['high'] and gpa >= data['low']:
return key
# When every check has failed:
return 'D'
更多更新:
D
:您发布的案例的平均值为89.25,不会出现在任何等级范围内。调整您的限制以计入浮动分数,或根据评分范围的要求转换(浮动或最高)平均值。答案 1 :(得分:0)
除了Prune指出的错误之外,该错误是您正在将GPA与get_letter_grade_v1中的data ['high']和data ['low']进行比较,这些数据的百分比不是GPA。
由于A +和A在grade_scale中具有相同的GPA,因此该等级也无法从GPA恢复。