如果程序中有其他数据类型,我怎么能让它返回错误

时间:2018-03-24 13:40:55

标签: python python-2.7

def calGPAbyLetter(letters):
    ''' (str) -> float OR str
    Take all the grade letters, limited to 10 subjects, and 
    calculate GPA. Grade letters must be A, B, C, D or F.

    >>> calGPAbyLetter("A A A B")
    3.75
    >>> calGPAbyLetter("A B B B")
    3.25
    >>> calGPAbyLetter("A B B B A C F A D ")
    2.67
    >>> calGPAbyLetter("A A A A B B B A C F A D F")
    'Error'
    >>> calGPAbyLetter("A A A A B C F A D F")
    2.6
    >>> calGPAbyLetter("S A B C F A D F")
    'Error'

    '''
    tGP = 0.0
    letter = map(str, letters.split())
    if len (letter) > 10:
        return "Error"
    for i in letter:
        gp = checkGP(i)
        if gp is str:
            return gp
        tGP = tGP + gp
    return round(tGP / len(letter), 2)
def checkGP(letter):
    ''' (str) -> int OR str
    Assign grade point from grade letter.
    Grade letters must be A, B, C, D or F.

    >>> checkGP('A')
    4
    >>> checkGP('B')
    3
    >>> checkGP('S')
    'Error'
    '''
    if letter < 0:
        return "Error"
    elif letter == "F":
        return 0.0
    elif letter == "D":
        return 1.0
    elif letter == "C":
        return 2.0
    elif letter == "B":
        return 3.0
    elif letter == "A":
        return 4.0
    else:
        return "Error"

现在我输入

calGPAbyLetter("A A A S")

它返回了

Traceback (most recent call last):
  File "<pyshell#33>", line 1, in <module>
    calGPAbyLetter("A A A B A A A A S")
  File "/Users/Sahiphopz/Documents/Programming and Algorithm/a05.py", line 30, in calGPAbyLetter
    tGP = tGP + gp
TypeError: unsupported operand type(s) for +: 'float' and 'str'
what to do to fix this please help

4 个答案:

答案 0 :(得分:1)

您的错误原因是

if gp is str:

不符合您的想法。 str是一个表示字符串的类。因此,您的代码所说的gp与类str相同,而不是if type(gp) == str: 。你需要做的是:

class A:
    pass

a = A()

print(a is A)

采用以下示例:

A

这将创建一个名为a的类,以及一个名为a的类的实例。虽然A的类型为A,但它本身不是print(a is A) ,因此

False

将打印tGP

这是导致代码错误的原因。 if语句未能按预期执行,因此您的代码尝试添加gp,这是一个浮点数"Error",设置为var count = 1; $("body").html("<button id=\"" + count +"\">1</button>"); $("body").on('click', '#' + count, function() { count++; $("body").html($("body").html() + "<button id=\"" + count +"\">" + count +"</button>"); });,这会导致您的错误

答案 1 :(得分:0)

您可以返回False而不是字符串&#34; ERROR&#34;像这样,

ibtool --compile MainMenu.storyboardc MainMenu.storyboard --module Book_Sources

答案 2 :(得分:0)

正如错误中所述,问题在于您尝试将str添加到float。您可以通过检查gp是否为str来解决此问题,但您的方法不起作用。 gp的类型为str,而str本身就是一种类型,因此请检查

if gp is str

不起作用,因为它们不具有可比性。相反,用这个替换该行:

if type(gp) == str

if gp == "Error"

其中任何一个都应该起作用。

答案 3 :(得分:0)

以下是构建逻辑的更清晰的方法。

def calGPAbyLetter(letters):

    letter = list(map(str, letters.split()))

    if len(letter) > 10:
        raise Exception('Maximum of 10 grades permitted')

    grades = list(map(checkGP, letter))

    return round(sum(grades) / len(grades), 2)

def checkGP(letter):
    d = {'F': 0, 'D': 1, 'C': 2, 'B': 3, 'A': 4}
    try:
        return d[letter]
    except KeyError:
        print('Unmapped grade supplied')

<强>解释

  • 不要返回含糊不清的“错误”字符串。提出特定的错误或异常,并为结果赋予一些意义。
  • checkGP内使用字典,而不是if / else构造。
  • 无需使用显式循环来聚合成绩值。您可以使用map(checkGP, letter)letter列表的每个值上运行该函数。