我试着把计算器做成功课。如果我提供正确的输入,看起来工作正常。但是,如果我将第一个数字设为空字符串,则程序崩溃:
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
答案 0 :(得分:4)
您的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()
我将两个异常合并到一个处理程序中。注意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
。