从测试中计算最终成绩

ron*_*nak 0 python python-2.x python-2.7

Lloyd = {
    "name":"Lloyd",
    "homework": [90,97,75,92],
    "quizzes": [ 88,40,94],
    "tests": [ 75,90]
    }
Alice = {
    "name":"Alice",
    "homework": [100,92,98,100],
    "quizzes": [82,83,91],
    "tests": [89,97]
    }
Tyler = {
    "name":"Tyler",
    "homework": [0,87,75,22],
    "quizzes": [0,75,78],
    "tests": [100,100]
    }

def average(value):
    avg=0
    items = len(value)
    for item in value:
        avg +=item 
    return avg/items

def getAverage(dictin):
    hw = average(dictin.get('homework'))
    quiz = average(dictin.get('quizzes'))
    tests = average(dictin.get('tests'))
    weighted_average = hw*.1 + quiz*.3 + tests*.6
    return weighted_average

def getLetterGrade(score):
    if score >=90:
        return "A"
    elif score < 90 and score >= 80:
        return "B"
    elif score < 80 and score >= 70:
        return "C"
    elif score < 70 and score >= 60:
        return "D"
    elif score < 60:
        return "F"
    else:
        return "No grades for you"

score = getAverage(Lloyd)
grade = getLetterGrade(score)
print grade
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我被告知,如果得分为89.5,它将无法正常工作.我也试过了,但我无法找出问题所在.任何错误都是受欢迎的.

Tam*_*más 5

catch可能在average您将integer(avg)除以另一个整数(items)的函数中.由于两个操作数都是整数,因此Python average也会将结果转换为整数,因此该函数永远不会返回小数分数.

有许多可能的解决方案:

  1. 在分割之前将其中一个操作数(avg或者items)转换为浮点数; 例如return float(avg)/items,或return (avg+0.0)/items.

  2. 让我们avg从0.0而不是0开始 - 这确保它avg始终是一个浮点数.

  3. 添加from __future__ import division到代码的最开头.这指示Python以Python 3.x方式使用除法并始终返回浮点数.

更新:根据MrGingerbear的评论,你也可以考虑将得分向上或向下舍入getLetterGrade.如果从模块导入ceilfloor函数math,可以说ceil(score)将其floor(score)四舍五入,向下round(score)舍入或将其四舍五入到最接近的整数.

  • 好答案.另一个可能的问题:如果你将小数百分比四舍五入到整数百分比,你需要在getLetterScore中做一些像ceil(grade)这样的事情.如果你不这样做,那么等级为89.5的getLetterScore(等级)将返回"B"而不是向上舍入到90,这将返回"A" (3认同)