2017-01-01 92 views
0

這是我在麻省理工學院開放式課件導論計算機科學第7講中遇到的一段代碼。這個小程序得到基礎和高度的輸入,然後用畢達哥拉斯定理計算斜邊。Python 3用類型()識別float float()

出於某種原因,它無法識別浮動條目。

的代碼如下:

#! /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)) 

回答

6

這是那些情況下,更容易請求原諒比許可之一。與其試圖查看對象並在行爲之前聲明它是一個float,嘗試將其用作float並捕獲任何異常。

也就是說,而是採用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))

3

的代碼似乎對Python的寫,而不是Python 3,因爲它需要input()返回的東西其他不是字符串。在Python 3中,input()總是返回一個字符串,它不會將eval()應用於像Python 2那樣的結果。

它有其他一些問題,如使用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布爾無論是。