2014-09-26 92 views
0

我试图检查raw_input是使用下面的码连续3 1选项的选择:从包含函数中返回变量如果ELIF else语句

def selectDiff(): 
    upperbound = 0 
    difficulty = ['easy', 'medium', 'hard'] 
    diff = raw_input(' or '.join(difficulty)).lower() 
    if diff in difficulty: 
     if diff == 'easy': 
      upperbound = 20 

     elif diff == 'medium': 
      upperbound = 25 

     elif diff == 'hard': 
      upperbound = 30 

    else: 
     print "Please select easy, medium or hard\n" 
     selectDiff() 

    return upperbound 

如果用户从难度列表输入一个值['easy','medium','hard']该函数按我的意愿工作,但如果用户首先输入列表中未包含的值,那么当它们最终输入在列表中找到的值时,变量upperbound将返回为0.我试着移动return语句,但结果是相同的,或者由于在变量被拒绝之前引用变量而出现错误。

是否有可能改变我的方法来产生所需的行为,还是应该使用另一种方法?

回答

4

使用一个while循环,该循环继续输入,直到用户输入正确的输入。

def selectDiff(): 
    difficulty = ['easy', 'medium', 'hard'] 
    while True: 
     diff = raw_input('easy, medium or hard').lower() 
     if diff in difficulty: 
      if diff == 'easy': 
       return 20 
      elif diff == 'medium': 
       return 25 
      elif diff == 'hard': 
       return 30  
     else: 
      print "Please select easy, medium or hard\n" 
3

你打电话给selectDiff(),然后忽略返回值。你最好使用循环而不是无限递归。

像这样的实例:

def selectDiff(): 
    while True: 
     diff = raw_input('easy, medium or hard').lower() 
     if diff=='easy': 
      return 20 
     if diff=='medium': 
      return 25 
     if diff=='hard': 
      return 30 
     print "Please select easy, medium or hard\n" 
5

我同意使用循环可能更有意义在这里,但如果你想使用递归保留,只是将upperbound到内selectDiff的结果。

def selectDiff(): 
    difficulty = ['easy', 'medium', 'hard'] 
    diff = raw_input(' or '.join(difficulty)).lower() 

    if diff in difficulty: 
     if diff == 'easy': 
      upperbound = 20 
     elif diff == 'medium': 
      upperbound = 25 
     elif diff == 'hard': 
      upperbound = 30 
    else: 
     print "Please select easy, medium or hard\n" 
     upperbound = selectDiff() # Use the returned value 

    return upperbound 

在一个侧面说明,你也可以使用一个dict更换elif链,使之更容易一点扩展。

def selectDiff(): 
    difficulty = { 
     'easy': 20, 
     'medium': 25, 
     'hard': 30, 
    } 

    diff = raw_input(' or '.join(difficulty)).lower() 
    try: 
     return difficulty[diff] 
    except KeyError: 
     print "Please select easy, medium or hard\n" 
     return selectDiff() 
0

我想是你所希望做的,是让upperbound动态范围的闭包变量,即使你可能不知道这些词的意思。这是行不通的,因为Python不会执行动态范围界定(也不适用于大多数其他现代语言),并且在3.x之前,如果分配给它们,Python闭包变量不起作用。

但是,您可以模拟要通过仔细使用全局变量,或(更好)词法范围的变量的作用域,并且可以通过存储内的另一个可变变量的变量赋值模拟。所以:现在

def selectDiff(): 
    upperbound = [0] 

    def realSelectDiff(): 
     difficulty = ['easy', 'medium', 'hard'] 
     diff = raw_input(' or '.join(difficulty)).lower() 
     if diff in difficulty: 
      if diff == 'easy': 
       upperbound[0] = 20 

      elif diff == 'medium': 
       upperbound[0] = 25 

      elif diff == 'hard': 
       upperbound[0] = 30 

     else: 
      print "Please select easy, medium or hard\n" 
      realSelectDiff() 

    realSelectDiff() 
    return upperbound[0] 

,每次调用realSelectDiff未设定upperbound的本地副本,他们都设置upperbound值的外selectDiff的副本。

所有这些都说了,这几乎不是一个好主意。如果你想使用递归,你几乎总是想把值传递给堆栈,并且你不想使用递归模拟循环。但值得理解这是如何工作的。

+0

更好更简单的答案存在 - 就像使用while或直接递归 - 这只是普通的复杂,没有明显的原因。 – 2014-09-26 22:42:56

+0

@ TonySuffolk66:这回答了OP的问题,并表明他有可能做他想做的事情,也表明这并不容易,这表明他不应该这样做。只要给他不同的代码,并说“这样做”并不能帮助他学习,而说谎并说“这是不可能的”,如果它帮助更少。 – abarnert 2014-09-26 23:01:43