Python 为什么计算器会崩溃

Python 为什么计算器会崩溃,python,python-3.x,Python,Python 3.x,我试着做一个计算器作为家庭作业。如果我给出正确的输入,它看起来可以正常工作。但如果我将第一个数字设为空字符串,程序将崩溃: TypeError: 'NoneType' object is not subscriptable 为什么会发生这种情况,我如何修复它 def read_numbers(): try: number1 = float(input("Give first number: ")) number2 = float(input("Give

我试着做一个计算器作为家庭作业。如果我给出正确的输入,它看起来可以正常工作。但如果我将第一个数字设为空字符串,程序将崩溃:

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
您的
read_numbers()
函数并不总是返回任何内容。如果函数结束时没有
return
语句,则返回
None
。当您递归(使用
ValueError
TypeError
时,您会忘记返回递归调用结果

您将返回递归调用,如下所示:

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()
注意
read_numbers()
调用上的
return
;仅仅因为嵌套调用返回一个值,并不意味着函数调用本身会自动传递该结果

但使用循环会更好:

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
s仅在参数类型无法转换为
float
,如字典或自定义对象时才会引发。

记住调用
read\u numbers()返回结果
在您的异常块中。我真的想重写代码,使用循环而不是递归。但据我所知,如果没有异常发生,它将返回结果。如果发生异常,它将再次询问数字。是的,我必须重写代码,但我想了解我在当前代码中的错误。@JonClements:如果这是Pyth在2上,您永远不知道
input()
…返回的是什么类型,但您有一个要点。