Python 3用type()识别float

时间:2017-01-01 16:33:34

标签: python python-3.x types

这是我在麻省理工学院开放式课程计算机科学第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))

2 个答案:

答案 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布尔值。