2010-05-25 75 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