为什么计算器崩溃了

时间:2013-11-14 21:09:11

标签: python python-3.x

我试着把计算器做成功课。如果我提供正确的输入,看起来工作正常。但是,如果我将第一个数字设为空字符串,则程序崩溃:

TypeError: 'NoneType' object is not subscriptable

为什么会发生这种情况,我该如何解决?

def read_numbers():
    try:
        number1 = float(input("Give first number: "))
        number2 = float(input("Give the second number: "))
        return [number1,number2]
    except ValueError:
        read_numbers()
    except TypeError:
        read_numbers()

def summa():
    numbers = read_numbers()
    return numbers[0]+numbers[1]

command = ""
while command != "q":
    command = input("Give command: ")
    if command == "s":
        print(summa())
    elif command == "q":
        break

1 个答案:

答案 0 :(得分:4)

您的read_numbers()函数并不总是返回任何内容。当函数以return语句结束时,将返回None。当您递归时(使用ValueErrorTypeError,您将忘记返回递归调用结果。

您将返回递归调用,如:

def read_numbers():
    try:
        number1 = float(input("Give first number: "))
        number2 = float(input("Give the second number: "))
        return [number1,number2]
    except (ValueError, TypeError):
        return read_numbers()

我将两个异常合并到一个处理程序中。注意return电话上的read_numbers();只是因为嵌套调用返回一个值,并不意味着函数调用本身会自动传递该结果。

但是使用循环会更好:

def read_numbers():
    while True:
        try:
            number1 = float(input("Give first number: "))
            number2 = float(input("Give the second number: "))
            return [number1,number2]
        except ValueError:
            pass  # continue the loop

return将结束循环以及函数。我删除了TypeError异常,input()总是返回一个字符串,float()只会在传递无法解析为浮点数的字符串时才会引发ValueError。仅当参数的类型无法转换为TypeError(例如字典或自定义对象)时才会引发float