2012-05-31 114 views
0

只是一個簡單的問題,因爲我真的找不到解決我的問題的簡單方法。 有沒有辦法讓一個,就是成爲一個整數的用戶輸入,但是當進入 程序不會打破和一個字符串,而不是顯示「錯誤」輸入字符串和整數

我一直在試圖解決它將字符串轉換爲整數,反之亦然,但我總是得到「無效的文字爲int()與基10」的錯誤,或者當它顯示「錯誤」,它在無限循環中這樣做。

這裏是我的代碼只是爲了幫助清除問題

choice = input("Enter your choice: ") 

while choice != 3: 
    if choice == 1: 
     get_songs() 
     print 
     main() 
    elif choice == 2: 
     read_songs() 
     print 
     main() 
    else: 
     print "Invalid choice" 

所以基本上我希望其他操作字符串的工作以及爲整數大於3或小於1

+2

的raw_input使用(),而不是輸入()和手動轉換,如果失敗則捕獲異常。 –

+0

Python 2.x或3.x? –

回答

9

,但我不斷收到「無效的字面INT()基數爲10」錯誤

你會得到一個例外,特別是ValueError。您可以使用except塊捕獲異常。欲瞭解更多信息,請參閱您目前使用的任何語言教程,或試用Google的except block Python

當它顯示「Error」時,它在無限循環中這樣做。

當您檢測到輸入不正確時,在再次嘗試循環之前需要獲取新輸入。將輸入信息放入循環中。 除了循環之外,不要使用遞歸(在main內調用main());否則使用遞歸()。你只會這樣迷惑自己。因爲在找到合適的choice值之前,直到您進入循環纔會得到choice的值,因此您可以更容易明確地將break置於循環之外,而不是試圖用循環來控制循環(即在其中進行測試while條件)。

我們也可以使用continue來簡化循環結構:我們不是在try塊中做所有工作,而是將其限制在我們提取數字的那一部分。我們在except塊中使用continue來跳過循環的其餘部分,因爲我們沒有實際的編號,只有在我們執行循環的時候才執行循環的其餘部分。 (畢竟,也許代碼我們呼籲choice == 1choice == 2可能raise ValueError一些完全不同的原因,我們會想做些什麼不同。)

while True: 
    try: 
     choice = int(raw_input("Give me a number")) 
    except ValueError: 
     print "Could you at least give me an actual number?" 
     continue 

    if choice == 1: 
     do_something() 
    elif choice == 2: 
     do_something_else() 
    elif choice == 3: 
     break 
    else: 
     print "Try a different number" 
+0

嗯,我不太熟悉嘗試,除了我的教程中的塊以外,但看起來非常簡單直接。我非常感謝你的回答,這讓我有一段時間了!感謝:) 其實,你的答案的一部分是有點混淆,如果用戶不輸入一個數字,循環的其餘部分被跳過,所以這意味着基本上是True:並嘗試:創建一個無限循環,直到給出明確的輸入? – Jertise

+1

只是爲了強調上述內容:使用raw_input而不是輸入是一個很好的做法,特別是如果這是爲了部署到更廣泛的受衆而設計的。傳遞給input()的語句會被評估,接受任意指令會產生一個安全漏洞。 http://docs.python.org/library/functions.html#input – abought

0

因爲這個選擇總是!= 3,你會得到一個無限循環。 如果跳轉到「其他」條件,您應該再次輸入。

0

這裏有一些東西:我不喜歡讓用戶圍繞字符串輸入""

ch = raw_input("Enter choice: ") 
#ch *is* a string at this point 
if ch.isdigit(): 
    choice = int(ch) 
else: 
    print "Invalid choice" 

編輯(從評論):

isdigit可能無法正確處理本地編碼。在Python 3中,您可以改用isdecimal。   — J.F.塞巴斯蒂安

+1

'isdigit()'在某些語言環境中可能不正確('int'拒絕輸入)。 Python 2使用C'isdigit()':[can isdigit合法地依賴於區域設置在C中](http://stackoverflow.com/q/2898228/4279)。檢查輸入是ascii('ord(ch)<128')還是更好使用try/except。在Python 3中,改用'isdecimal()'。 – jfs

0

在你的代碼中,while循環應該封裝的input()線。下面是一個更清晰的選擇,但是:

創建一個函數,它獲取用戶輸入:

def getInteger(prompt): 
    while True: 
     userIn = input(prompt) 
     try: 
      return int(userIn) 
     except ValueError: 
      print "Error"