2016-11-16 70 views
1

Python新手在這裏。我一直在關注流量控制,並且遇到了我不太瞭解與例外有關的情況。有時會將float傳遞給int()方法,但並不總是

在下面的代碼我希望用戶在給定的範圍內輸入一個整數,並在違規的情況下,不斷地問他們,直到他們給一個有效值:

while True: 
    try: 
     x = int(raw_input("Pick an integer between 2 and 9. ")) 
    except ValueError: 
     print "Please enter an integer!" 
     continue 
    else: 
     if 2 <= x <= 9: 
      print("Your number is {0}.").format(x) 
      break 
     else: 
      print "That's not between 2 and 9!" 
      continue 

至於我可以告訴,這段代碼正如我所希望的那樣工作。我已經拋出了我能想到的所有其他類型的輸入,並且它只能讓您在輸入2-9的整數時退出循環。 甚至不接受漂浮物。

我的問題是,因爲int()可以成功地叫上彩車,

>>> int(2.1) 
2 

爲什麼會發生這種嘗試/ except結構引發異常當輸入是float?如果我在沒有try/except語句的情況下運行代碼並輸入除整數以外的任何內容,則會引發錯誤並退出。

我從Windows PowerShell運行python 2.7。

+0

因爲你不是在浮動上調用它。 –

+0

你檢查的是ist int(「2.1」)。這引發了一個異常。 raw_input返回一個str。 – Humbalan

回答

1

這是因爲raw_input返回一個字符串。

在引擎蓋下,當你撥打int時,它實際上調用了一個對象object.__int__()的方法。這是不同的對象。
對於浮點數,這會截斷一個值(舍入爲0)。
在字符串上,它試圖根據https://docs.python.org/3/reference/lexical_analysis.html#integer-literals(其不能有.)解析int

+0

啊謝謝你!我沒有考慮到'int'可能對'raw_input'返回的字符串的工作方式不同於實際的原始輸入。歡呼聲的鏈接,根本沒有看到詞法分析器的影響,應該有助於理解。 – FarTooFickle

0

這裏的問題是,你打電話給int()一個可能包含句點的字符串。爲了解決這個問題,我建議你將int()更改爲float()。這應該可以解決您的問題

x = float(raw_input("Pick an integer between 2 and 9. ")) 
+0

諾諾,它完美的作品!我只是無法理解爲什麼當int()'通常在浮點數上工作的很好時它會捕獲浮點數。沒有想到'raw_input()'返回一個字符串的事實。如果我使用了float(),那麼我必須添加一個額外的檢查來確保用戶輸入了一個整數而不是浮點數。 編輯*我應該無論如何應該做的,以便它可以工作的值不是'raw_input()'給出的值... ... 感謝您的答覆 – FarTooFickle

0

不知道你使用的是什麼版本的Python但如果是Python的3.0或以上,你可能要仔細檢查打印語句在下面的剪輯

except ValueError: 
    print "Please enter an integer!" 

else: 
    print "That's not between 2 and 9!" 

他們沒有格式化爲3.0,但可能會工作正常,如果您使用版本2.x 我認爲其他答案充分涵蓋了您的原始問題,所以我會按照他們..他們知道該區域比我好。 好運,
Poe