2010-05-25 76 views
0

我想在Python中創建一個基於文本的菜單。在Python中處理文本菜單

下面是代碼:

#!/usr/bin/env python 

def testcaseOutput(): 

    print '1. Add. 2. Subtract. 3. Divide. 4. Multiply' 

    try: 
     answer = int(raw_input('Enter a value (1 - 4) >. ')) 
    except ValueError: 
     print 'Invalid input. Enter a value between 1 -4 .' 
     testcaseOutput() 

    if answer in range(1, 5): 
     return answer 
    else: 
     print 'Invalid input. Enter a value between 1 - 4.' 
     testcaseOutput() 

我的問題:

當用戶輸入一個無效的輸入,即不是一個數字,我想這個功能,再次調用。所以我使用了我認爲是糟糕的設計的遞歸方法。我在

if answer in range(1, 5). 

再次使用該方法是否有任何其他方式來處理?當輸入無效時,我需要再次提示。

另外,有沒有什麼辦法可以解決這兩個約束:檢查輸入是否是數字並檢查數字是否在範圍(1,5)中?正如你所看到的,我正在單獨檢查。

+0

相關:http://www.wellho.net/resources/ex.php4?item=y103/python_switch_case – badp 2010-05-25 10:10:55

回答

3

一種可能的重構是使用循環的,繼續打印指令和讀取輸入直到上可接受的輸入已被下式給出:

def testcaseOutput(): 
    while True: 
     print '1. Add. 2. Subtract. 3. Divide. 4. Multiply' 

     try: 
      answer = int(raw_input('Enter a value (1 - 4) >. ')) 
     except ValueError: 
      print 'Invalid input. Enter a value between 1 -4 .' 
      continue 

     if not answer in range(1, 5): 
      print 'Invalid input. Enter a value between 1 - 4.' 
      continue 

     return answer 
+0

謝謝。我想使用循環,但不知道如何去做。 – user225312 2010-05-25 10:02:12

1

放置在一個while True:循環函數的整個身體(除去當然是遞歸調用)。

2
def testcaseOutput(): 

    answer = None 
    legal_answers = ['1','2','3','4'] 
    tried = False 
    while answer not in legal_answers: 
     print "%s1. Add. 2. Subtract. 3. Divide. 4. Multiply" % \ 
       "Invalid input. " if tried else "" 
     answer = raw_input('Enter a value (1 - 4) >. ') 
     tried = True 

    return answer #int(answer) if you really do want integers