尝试从字典中获取数据时,函数返回none

时间:2013-06-14 15:43:09

标签: python

我正在关注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))

5 个答案:

答案 0 :(得分:8)

您的比较逻辑已被破坏。这样:

elif score <= 80 and score < 90:

说“如果分数小于或等于80,小于90”......那么如果得分为80.55,则永远不会成立。你的意思是说“如果分数超过 80且小于90”。

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

elif 80 <= score < 90:

答案 1 :(得分: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"

答案 2 :(得分: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

答案 3 :(得分: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"

答案 4 :(得分:0)

if/elif函数中的get_letter_grade()逻辑存在缺陷。您可以通过实现只需检查下一个更高的值来查看下一个更高的值来查看是否高于该值,以了解每个后续returnif的内容,因为之前的任何一个已经检查了高于此水平。这就是我的意思:

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"

另请注意,如果所有elif都失败,则该函数将返回"F",因为最后一个子句是else,而不是前面的elif。这可以防止函数返回None,这实际上是在函数没有在“结束”之前用另一个值显式执行return时会发生的情况。