0

我正在学习 codecademy.com 上的教程,由于某种我无法理解的原因,我的程序没有返回预期值,而是返回值“none”。

我不明白为什么。你介意看看吗?

我使用的词典是:

lloyd = { "name": "Lloyd",
         "homework": [90.0, 97.0, 75.0, 92.0],
         "quizzes": [88.0, 40.0, 94.0],
         "tests": [75.0, 90.0] }
alice = { "name": "Alice",
          "homework": [100.0, 92.0, 98.0, 100.0],
          "quizzes": [82.0, 83.0, 91.0],
          "tests": [89.0, 97.0] }
tyler = { "name": "Tyler",
          "homework": [0.0, 87.0, 75.0, 22.0],
          "quizzes": [0.0, 75.0, 78.0],
          "tests": [100.0, 100.0] }

我尝试了以下功能:

def average(x):
    return sum(x)/len(x)

def get_average(x):
    a = (sum(x['homework'])/len(x['homework']) * 0.1 + 
         sum(x['quizzes'])/len(x['quizzes']) * 0.3 + 
         sum(x['tests'])/len(x['tests']) * 0.6)
    return a

def get_letter_grade(score):
    if score >= 90:
        return "A"
    elif score <= 80 and score < 90:
        return "B"
    elif score <= 70 and score < 80:
        return "C"
    elif score <= 60 and score < 70:
        return "D"
    elif score < 60:
        return "F"

print get_letter_grade(get_average(lloyd))
4

5 回答 5

8

你的比较逻辑坏了。这个:

elif score <= 80 and score < 90:

说“如果分数小于或等于80,并且小于90”......所以如果分数是80.55,那永远不会是真的。您的意思是说“如果分数超过80 且低于 90”。

用 Python 编写它的常用方法是这样的:

elif 80 <= score < 90:
于 2013-06-14T15:49:58.357 回答
2

您的功能有一个错误get_letter_grade:您使用了>=三次<=。一个固定的(稍微整洁的)版本:

def get_letter_grade(score):
    if score >= 90:
        return "A"
    elif 80 <= score < 90:
        return "B"
    elif 70 <= score < 80:
        return "C"
    elif 60 <= score < 70:
        return "D"
    elif score < 60:
        return "F"
于 2013-06-14T15:51:43.673 回答
2

这是思考问题的另一种方式:让数据结构完成大部分工作

def get_letter_grade(score):
    grades = [('A', 90), ('B', 80), ('C', 70), ('D', 60), ('F', 0)]
    for g, s in grades:
        if score >= s: return g
于 2013-06-14T15:56:47.807 回答
1

你的函数有问题,它正在检查它是否存在<= 80以及<90它应该在哪里检查它是否存在>=80,固定函数将是:

def get_letter_grade(score):
    if score >= 90:
        return "A"
    elif score >= 80 and score < 90:
        return "B"
    elif score >= 70 and score < 80:
        return "C"
    elif score >= 60 and score < 70:
        return "D"
    elif score < 60:
        return "F"
于 2013-06-14T15:52:10.433 回答
0

函数中的if/elif逻辑get_letter_grade()有缺陷。您可以通过意识到您只需要检查下一个更高的值以查看分数是否高于该分数来了解return每个成功的内容来简化和纠正它,if因为之前的任何一个都已经检查了高于该分数的级别。这就是我的意思:

def get_letter_grade(score):
    if score >= 90:
        return "A"
    elif score >= 80:  # we also know it's < 90 because the prior if failed
        return "B"
    elif score >= 70:  # we also know it's < 80 because all the prior ifs failed
        return "C"
    elif score >= 60:  # we also know it's < 70 because all the prior ifs failed
        return "D"
    else:              # we know it's < 60 because all the prior ifs failed
        return "F"

另请注意,如果所有elifs 都失败,则该函数将返回 an,因为"F"最后一个子句与前面的子句不同。这可以防止函数返回,如果一个函数在“结束”之前没有显式地执行另一个值,就会发生这种情况。elseelifNonereturn

于 2013-06-14T17:52:39.450 回答