不知道错误在哪里。代码无理由返回False

时间:2015-07-29 11:06:58

标签: python

你能告诉我,为什么这段代码返回False?我刚刚开始学习python,并且不知道为什么这样做不起作用。

#!/usr/bin/python
from math import *
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(numbers):
    total = sum(numbers)
    total = float(total)
    total = total / len(numbers)
    return total

def get_average(students):
    homework = average(students["homework"])
    quizzes = average(students["quizzes"])
    tests = average(students["tests"])
    homework = homework * 0.1
    quizzes = quizzes * 0.3
    tests =  tests * 0.6
    score = tests + quizzes + homework
    score = float(score)
    return score

def get_letter_grade(score):
    score = float(score)
    if score == int or score == float:
        if score >= 90:
            return "A"
        elif score >= 80:
            return "B"
        elif score >= 70:
            return "C"
        elif score >= 60:
            return "D"
        else:
            return "F"
    else:
        return False

print get_letter_grade(get_average(lloyd))

提前谢谢你;)

3 个答案:

答案 0 :(得分:1)

问题在于:

if score == int or score == float:

你想要的是:

if isinstance(score, (int, float)):

您的变量score永远不会等于班级int或班级float。但它可以是intfloat的实例。

另一个有效的变体是:

if type(score) is int or type(score) is float:

或:

if type(score) in (int, float):

答案 1 :(得分:1)

在尝试进行类型比较之前,行:

score = float(score)

score所有内容转换为浮点数。检查后面的score类型是没有意义的 - 它必须是一个浮点数。如果score无法转换为浮点数,则会抛出ValueError异常,并且根本不会执行后续代码。

话虽如此,我认为你的意思是进行类型比较:

if type(score) == int or type(score) == float:

这会有效,因为您要将score类型类型 int/float进行比较。但是,最好(因为isinstance()考虑继承)来执行这样的检查:

if isinstance(score, (int, float)):

但是,正如我在开头所说的那样,不需要进行类型检查,因为在检查时,变量必须是浮点数。

您可以重写函数以使用try/except块,如下所示:

def get_letter_grade(score):
    try:
        score = float(score)
        if score >= 90:
            return "A"
        elif score >= 80:
            return "B"
        elif score >= 70:
            return "C"
        elif score >= 60:
            return "D"
        else:
            return "F"
    except ValueError:
        return False

答案 2 :(得分:0)

您应该以这种方式检查类型

/etc/hosts

而不是

if type(score) == int or type(score) == float:

因为得分是值而非类型本身,所以它总是返回false。

此外,如果您将其转换为浮动,则可以将其删除。这是更安全的方式:

if score == int or score == float: