这是我在麻省理工学院开放式课程计算机科学第7讲中遇到的一段代码。这个小程序得到基数和高度的输入,然后用毕达哥拉斯定理计算斜边。
由于某种原因,它无法识别浮动的进入。
代码如下:
#! /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5
import math
#Get base
inputOK = False
while not inputOK:
base = input("Enter base: ")
if type(base) == type(1.0):
inputOK = True
else:
print("Error. Base must be a floating point number.")
#Get Height
inputOK = False
while not inputOK:
height = input("Enter height: ")
if type(height) == type(1.0):
inputOK = True
else:
print("Error. height must be a floating point number.")
hyp = math.sqrt(base*base + height*height)
print("Base: " + str(base) + ", height: " + str(height) + ", hypotenuse:" + str(hyp))
答案 0 :(得分:6)
这是其中一种要求宽恕而不是许可的情况之一。在你行动之前,不要试图查看对象并断言它是一个浮点数,尝试将它用作浮点数并捕获任何异常。
也就是说,而不是使用if
使用:
try:
base = float(base)
inputOK = True
except ValueError as e:
print("Error. Base must be a floating point number.")
这同样适用于您之后尝试获得的height
值。
无论如何,input()
会返回一个字符串,因此type(input())
将始终返回str
。最好将它强制转换为浮点数(注意:int
s也适用于浮点数),看看它是否可以接受,而不是试图通过if
检查来识别它的类型。
强制性地说,如果您甚至需要检查类型,请不要使用type(obj_a) == type(obj_b)
,使用isinstance(obj_a, type(obj_b))
可能总是更好。
答案 1 :(得分:3)
代码似乎是为 Python 2 而不是Python 3编写的,因为它需要input()
来返回其他而不是字符串。在Python 3中,input()
总是返回一个字符串,它永远不会像{2}那样将eval()
应用于该结果。
它还有其他问题,例如使用type(base) == type(1.0)
,完全忽略float
对象的可用性并使用is
来测试身份,并完全错过了优势isinstance()
功能。
只需使用异常处理:
while True:
try:
base = float(input("Enter base: "))
break
except ValueError:
print("Error. Base must be a floating point number.")
请注意,也不需要inputOK
布尔值。