2017-01-01 4 views
0

これは、MIT OCWのコンピュータサイエンスの第7回講義で遭遇したコードです。この小さなプログラムは基底と高さの入力を受けて、ピタゴラスの定理で斜辺を計算します。Python 3が浮動小数点型()を認識しています

何らかの理由により、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

許可よりも許しを求めることが容易である場合の一つです。あなたが行動する前にオブジェクトを見て、それが浮動小数点であると主張するのではなく、それを浮動小数点として使用して例外をキャッチしてみてください。

代わり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も該当し、浮動小数点数になります)、ifのチェックでその型を判別しようとするよりも容認できるかどうかを確認してください。

タイプを確認する必要がある場合でも、type(obj_a) == type(obj_b)は使用しないでください。isinstance(obj_a, type(obj_b))を使用することをお勧めします。それは、文字列以外他の何かを返すようにinput()を必要と

3

コードは、Pythonの2、ないのPython 3用に書かれているように見えます。 Python 3では、input()は常に文字列を返しますが、Python 2のようにその結果にeval()が適用されることはありません。

それは完全にfloatオブジェクトの利用可能性を無視し、アイデンティティをテストするためにisを使用して、type(base) == type(1.0)を使用してのように、同様に他の問題があり、はるかに優れたisinstance()機能に完全にミス。

は、だけではなく、例外処理を使用します。

while True: 
    try: 
     base = float(input("Enter base: ")) 
     break 
    except ValueError: 
     print("Error. Base must be a floating point number.") 

inputOKブールの必要はどちらかがないこと。

関連する問題