假设您在这里使用的是Python3.x,那么每一行:n1 = float(input ("Enter your first number: "))
…将引发一个ValueError,如果给定了不能转换为浮点的内容。
所以,与其验证然后转换,不如尝试转换,让转换器成为自己的验证器。
例如,不是这样:n1 = float(input ("Enter your first number: "))
n2 = float(input ("Enter your second number: "))
print ("Your result is: ", n1 + n2)
……你可以这样做:while True:
try:
n1 = float(input ("Enter your first number: "))
n2 = float(input ("Enter your second number: "))
except ValueError:
print("When I ask for a number, give me a number. Come on!")
else:
print ("Your result is: ", n1 + n2)
break
如果要分别检查每个值,只需在try上执行两个较小的循环,而不是一个较大的循环。
与其将代码复制粘贴6次,不如将其重构为一个函数。像这样的:def get_two_floats():
while True:
try:
n1 = float(input ("Enter your first number: "))
n2 = float(input ("Enter your second number: "))
except ValueError:
print("When I ask for a number, give me a number. Come on!")
else:
return n1, n2
或者,如果要分别验证每一个:def get_float():
while True:
try:
return float(input ("Enter your second number: "))
except ValueError:
print("When I ask for a number, give me a number. Come on!")
def get_two_floats();
return get_float(), get_float()
然后你可以这样做:if choice == "1":
n1, n2 = get_two_floats()
print ("Your result is: ", n1 + n2)
elif choice == "2":
n1, n2 = get_two_floats()
print ("Your result is: ", n1 - n2)
# etc.
顺便说一句:要捕获零除,不要处理所有异常,然后根据输入找出导致错误的原因,只需处理ZeroDivisionError。(一般来说,除非您要使用sys.exc_info()、re-raise或类似的方法,否则光的except:是个坏主意。使用except SpecificException:几乎总是更好的。或者,更常见的是,except SpecificException as e:,这样您就可以对e执行某些操作,比如在错误消息中输出print)