“if”谓词中的不可排序类型

时间:2015-07-23 19:36:00

标签: python python-3.x

def determineLetterGrade():
    global letterGrade, testAvg;
    if (testAvg <= str(100)) and (testAvg >= str(90)):
        letterGrade = "A";
    else:
        if (testAvg <= 89.99) and (testAvg >= 87):
            letterGrade = "B+";
        else:
            if (testAvg <= 86.99) and (testAvg >= 80):
                letterGrade = "B";
            else:
                if (testAvg <= 79.99) and (testAvg >= 77):
                    letterGrade = "C+";
                else:
                    if (testAvg <= 76.99) and (testAvg >= 70):
                        letterGrade = "C";
                    else:
                        if (testAvg <= 69.99) and (testAvg >= 67):
                            letterGrade = "D+";
                        else:
                            if (testAvg <= 66.99) and (testAvg >= 60):
                                letterGrade = "D";
                            else:
                                if (testAvg <= 59.99) and (testAvg >= 0):
                                    letterGrade = "F"
    # end determineLetterGrade function

中期项目,创建函数,这是函数determineLetterGrade。使用if语句确定测试平均值的字母等级。当我去运行它时,我收到一条错误消息:

if (testAvg <= str(100)) and (testAvg >= str(90)):
TypeError: unorderable types: function() <= str()

4 个答案:

答案 0 :(得分:0)

错误就像它在锡上所说的那样:解释器无法确定当你将函数和字符串交给它时哪个更大。这意味着testAvg是代码中其他位置的函数的名称。您需要使用任何适当的参数实际调用它,并使其return具有正确的值。调用一次,然后将其保存到像average_score = testAvg()这样的局部变量(根据需要传递参数)。然后,您可以进行比较......但是您不应该将其他值转换为字符串。将它们保留为整数。

此外,您应该重新构建代码,以使用else..if关键字的结构替换重复的elif块。

答案 1 :(得分:0)

您收到该错误是因为您通常不想比较两种不同类型的对象,在本例中是函数和字符串。首先,修复testAvg,使其成为一个数字而不是一个函数,因为我认为这是你想要比较的。您可能将testAvg设置为函数而不是该函数返回的函数。

if (testAvg <= str(100)) and (testAvg >= str(90))

应该是:

if (testAvg <= 100) and (testAvg >= 90)

在你的函数中还有很多东西可以改进,例如不使用全局变量(改为返回字符串),而是使用elif代替else if,纠正缩进和条件链接(例如上面可以写成90 <= testAvg <= 100)。但这应该解决你的特定问题。

答案 2 :(得分:0)

1。)你可能只是有点粗心,因为在你的代码中有一些这样的行:

def testAvg():
    return anything

并且您错过了将()添加到函数名称testAvg,因此您获得函数本身而不是其返回值。< / p>

2。)或被这样的一些行误导:

def Anyfunction():
    anything

testAvg = Anyfunction  

因此您认为testAvg是一个简单的变量。

3。)或者它发生了一个简单的粗略重新定义变量testAvg由一个具有相同名称的函数:

testAvg = anyvalue

def testAvg():
    anything

在第三种情况下,您必须修复代码。 在前两种情况下,您必须像这样修复代码:

if (testAvg <= str(100)) and (testAvg() >= str(90)):

在每一个相关的行中。

答案 3 :(得分:0)

错误消息告诉您究竟出了什么问题。您正在将函数与字符串进行比较。

此外,您还没有处理以下几种情况: - 例如,如果输入值介于79.99和80之间怎么办?如果它是79.995怎么办? - 如果您收到输入> 100< 0

,该怎么办?

从风格上讲,你也在做一些荒谬的事情。你不应该在函数中声明全局变量,你应该将参数传递给函数,而testAvg(至少,你传入的值)应该是一个浮点数,而不是一个函数。您应该使用elif,而不是else: if ...。你不应该把东西扔到字符串上。您应该将浮点数与int或其他浮点数进行比较。你也使用分号,这在python中相当不错。脚本语言通常省略分号。

由于你的期中已经结束,这不能帮助你作弊,这是一个有效的例子(它有点优化,但是如果你通过阅读并理解它在做什么,你将成为一个更好的程序员例如,想知道为什么该数组中有两个'A'个字符,以及为什么我使用整数除法。

from sys import argv

def determineLetterGrade(testAvg):
  if 0 <= testAvg and testAvg <= 100:
    grade_range = int(testAvg // 10)
    if grade_range < 6:
      grade = 'F'
    else:
      grade = 'DCBAA'[grade_range - 6]
      if grade != 'A' and (testAvg % 10) >= 7:
        grade += '+'
    return grade
  else:
    raise Exception("Grade out of range")

if __name__ == '__main__':
  print determineLetterGrade(float(argv[1]))

在决赛中,传球记录...... 你的成绩计算有点不稳定。我在上面使用它,但在大多数等级系统中加上'+',它也可以得到' - '。