2010-11-22 33 views
-2

我有一個菜單要求用戶選擇其中一個選項。由於這個菜單是從1到10,我使用raw_input之外的輸入。Python輸入字符串錯誤(不想使用raw_input)

我的代碼作爲if語句,如果用戶輸入的數字是從1到10,它會執行該選項。如果用戶輸入除此之外的任何數字,則else語句對用戶說1到10之間的數字。

問題是如果用戶輸入一個字符串,比如說qwert。它給我一個錯誤,因爲它是一個字符串。我明白爲什麼,我不想使用raw_input。

我能做些什麼,以文在用戶鍵入它去我else語句和打印的字符串,例如「只有數字是有效的。從1至10選擇一個數字」

我不希望使用任何先進的編程做這個

問候,

Favolas

編輯 感謝您的答案和響應遲到抱歉,但我不得不這樣我的健康問題。

我不能使用嘗試或除了因爲我的老師不允許它。 最後,我用raw_input是因爲它是最簡單的選擇,但很高興看到有很多方法可以解決這個問題。

問候,

Favolas

+0

你有沒有試過**試**,**除**聲明? – crodjer 2010-11-22 13:07:51

+0

我敢說,嘗試,除非不是高級編程,而且如果您不想測試所有可能的輸入類型並單獨處理它們,那麼它是唯一合乎邏輯的選擇。 – snarkyname77 2010-11-22 13:43:19

+9

-1當你說你不想使用'try ... except'模塊時,這停止了一個有效的問題。這就像要求如何在不使用循環的情況下從一到十打印數字。異常處理的_point_使程序員能夠處理exceptions_。你對他們有什麼? – katrielalex 2010-11-22 14:08:02

回答

5

當您嘗試將字符串轉換爲數字時,可能會引發異常。 例子:

try: 
    int(myres) 
except: 
    print "Only numbers are valid" 
3

你真正追求的是如何找出如果事情就可以通過爲整數。下面將做的工作:

try: 
    i = int(string_from_input) 
ecxept ValueError: 
    # actions in case the input is anything other than int, like continuing the loop 
+0

感謝您的回答,但我不想嘗試或除了 – Favolas 2010-11-22 13:33:09

+1

確定嗎?這是最好的解決方案。另一種選擇是對字符串對象使用'isdigit()'函數。如果字符串只包含數字,即。不','或'。'它會返回true。 – knutin 2010-11-22 13:58:18

4

林不知道你考慮先進的 - 一個簡單的方法來做到這將是像這樣的東西。

def getUserInput(): 
    while True: 
     a = raw_input("Enter a number between 1 and 10: ") 
     try: 
      number = int(a) 
      if (0 < number <= 10): 
       return number 
      else: 
       print "Between 1 and 10 please" 
     except: 
      print "Im sorry, please enter a number between 1 and 10" 

在這裏,我使用了try/except語句,以確保輸入的字符串可以轉換爲整數。直到輸入的數字在1到10之間(0 <數字< = 10)循環(它將保持運行)

+0

感謝您的答案,但我不想使用嘗試或除了 – Favolas 2010-11-22 13:35:21

4

應該使用raw_input(),即使你不想:)這將永遠給你一個字符串。然後,您可以使用代碼如

s = raw_input() 
try: 
    choice = int(s) 
except ValueError: 
    # choice is invalid... 

嘗試轉換爲int。

+0

感謝您的答案,但我不想使用嘗試或除 – Favolas 2010-11-22 13:33:48

+3

@Favolas:克服它。 – martineau 2010-11-22 15:28:34

0

我可以推薦在Python 3.1中使用這個函數嗎?這兩個參數是預期的數字範圍。

def get_number(a, z): 
    if a > z: 
     a, z = z, a 
    while True: 
     try: 
      line = input('Please enter a number: ') 
     except EOFError: 
      raise SystemExit() 
     else: 
      if line: 
       try: 
        number = int(line) 
        assert a <= number <= z 
       except ValueError: 
        print('You must enter base 10 digits.') 
       except AssertionError: 
        print('Your number must be in this range:', a, '-', z) 
       else: 
        return number 
      else: 
       print('You must enter a number.') 
+0

謝謝你的回答,但我不想嘗試或除了 – Favolas 2010-11-22 13:36:06

+2

@favolas:爲什麼這個隨機的要求?嘗試除了什麼? – SilentGhost 2010-11-22 13:58:08

2

你顯然有異常處理的東西。我不明白爲什麼 - 它是(不僅僅是Python)編程的一個基本部分,也是你應該適應的東西。它不比處理錯誤代碼更「先進」,只是一種不同的心態。

這裏是文檔。這很簡單:

有可能編寫程序, 處理選定的例外。看 以下示例中,用於提示用戶 輸入直到 已經輸入了有效的整數,但允許用戶 中斷程序(使用 控制-C或任何操作 系統支持);請注意, 用戶生成的中斷是 ,通過提高 KeyboardInterrupt異常來發送信號。

>>> while True: 
...  try: 
...   x = int(raw_input("Please enter a number: ")) 
...   break 
...  except ValueError: 
...   print "Oops! That was no valid number. Try again..." 
... 

try語句的工作原理如下。

首先,try語句( 語句(s)在try和 之間的關鍵字除外)被執行。如果沒有發生 異常,則跳過除外子句 ,並結束執行try 語句。如果在執行try 子句期間發生異常 ,則跳過該子句的其餘部分 。然後,如果其類型匹配除 關鍵字之外以 命名的異常,則except子句將執行 ,然後在try語句後繼續執行 。如果發生 異常,該異常與 子句中名爲 子句的異常不匹配,則將其傳遞給外部嘗試 語句;如果未找到處理程序,則 是未處理的異常,並且 執行停止,並顯示消息 ,如上所示。一個try語句可能有 多於一個除了從句,到 爲不同的 例外指定處理程序。最多隻有一個處理程序將執行 。處理程序僅處理髮生在 相應try子句中的 異常,而不處理相同t​​ry語句的其他 處理程序。除了第一個 可以命名多個 異常作爲一個括號中的元組, 例如:

... except (RuntimeError, TypeError, NameError): 
...  pass 

最後一個except子句可以省略 例外姓名(或名稱),以作爲 通配符。以極端 謹慎使用此操作,因爲以這種方式很容易掩蓋 真正的編程錯誤!它 也可以用來打印錯誤 消息,然後重新引發 異常(可以使調用者來處理 異常以及):

2

個人而言,我喜歡我的第一個回答更好。但是,這個應該用更多的代碼來滿足你的要求。

import sys 

def get_number(a, z): 
    if a > z: 
     a, z = z, a 
    while True: 
     line = get_line('Please enter a number: ') 
     if line is None: 
      sys.exit() 
     if line: 
      number = str_to_int(line) 
      if number is None: 
       print('You must enter base 10 digits.') 
      elif a <= number <= z: 
       return number 
      else: 
       print('Your number must be in this range:', a, '-', z) 
     else: 
      print('You must enter a number.') 

def get_line(prompt): 
    sys.stdout.write(prompt) 
    sys.stdout.flush() 
    line = sys.stdin.readline() 
    if line: 
     return line[:-1] 

def str_to_int(string): 
    zero = ord('0') 
    integer = 0 
    for character in string: 
     if '0' <= character <= '9': 
      integer *= 10 
      integer += ord(character) - zero 
     else: 
      return 
    return integer 
+3

您是否需要將此代碼轉換爲一個函數或使其不使用任何函數? – 2010-11-23 01:21:13