2010-10-19 86 views
3

我一直在試圖解決這一一會兒,似乎無法使其工作的權利..這是我目前的工作如何確定何時輸入字母?

while True: 

    guess = int(raw_input('What is your number?')) 

    if 100 < guess or guess < 1: 
     print '\ninvalid' 

    else: 
     .....continue on 

現在我已經說得那麼當用戶輸入一個數字越大超過100或低於1時,打印出「無效」。但如果我想這樣做,當用戶輸入一個不是數字的字符串(字母,標點等)時,它也會返回這個「無效」消息?

我曾考慮過如果不是... isdigit(),但它不會工作,因爲我得到的猜測作爲一個整數爲了上述範圍的工作。嘗試/除了是我想過的另一個選項,但仍然沒有想出如何正確實現它。

+2

你也可以做'if 1 <= guess <= 100:' – Daenyth 2010-10-19 16:28:49

回答

6

可以使用異常處理:

try: 
    guess = int(raw_input('What is your number?')) 
    if not (1 <= guess <= 100): 
     raise ValueError 
    # .....continue on 
except ValueError: 
    print '\ninvalid' 

這樣,\ninvalid將如果用戶要麼輸入一個非數字串或輸入數字串大於100或小於1

印刷

編輯:好的,我提交到x < y < z語法。不過,當它與not一起使用時,仍然認爲它失去了一些魅力。

+1

哇謝謝你Frederic你的代碼似乎簡單得多。雖然我從來沒有學過python中的「raise」,但在什麼情況下你可以使用它?它如何受益?謝謝!並感謝所有捐助者 – neogeo 2010-10-19 09:49:26

+0

@neogeo,'raise'允許你自己拋出異常(參見[http://python.about.com/odtingstarted/ss/begpyexceptions_7.htm](http://python。 about.com/od/gettingstarted/ss/begpyexceptions_7.htm))。在你的情況下,如果傳遞的值不是數字,那麼'int()'會引發'ValueError'。如果我們通過提高'ValueError'來擴展該行爲,如果該值是數字,但在我們的域之外,我們可以同時處理同一地點的兩個錯誤情況。 – 2010-10-19 09:55:36

5
while True: 
    try: 
    guess = int(raw_input("...")) 
    except EOFError: 
    print "whoa nelly! EOF? we should probably exit" 
    break # or sys.exit, or raise a different exception, 
    # or don't catch this at all, and let it percolate up, 
    # depending on what you want 
    except ValueError: 
    print "illegal input: expected an integer" 
    else: 
    if not (1 <= guess <= 100): 
     print "out of range" 
    else: 
     print "processing guess... (but if it wasn't 42, then it's wrong)" 
     break # out of while loop after processing 
+0

+1,用於在'try'和'except'之間放置最少數量的行,並且使用'1 <= guess <= 100'語法。 – EOL 2010-10-19 12:22:20

+0

我喜歡弗雷德缺少重複,但是在這裏有更多的Pythonic比特。 ('x 2010-10-19 15:04:55

+0

@Nick:通常你會處理*非法*輸入(即不是數字)與*無效*輸入不同(即超出範圍),即使只是告訴用戶更多的信息。一旦發生,就不會有重複。 (注意空格:在「非法」/「無效」中區分術語並不重要,我甚至沒有遵循上述原則,除非另有規定,否則我不認識任何人。技術/標準規格中的相同想法)。 – 2010-10-19 15:09:18