2013-02-24 148 views
0
def Help(string): 
    while True: 
     if string == 'Manifest': 
      return Manifest() 
      break 
     elif string == 'Intent': 
      return Intent() 
      break 
     else: 
      print('The options available are: \n') 
      for i in andHelp: 
       print(i) 
      print('Type Q to Quit \n') 
      x = input('What option do you choose: ') 
      print('\n') 
      if x == 'Q': 
       break 
      else: 
       Help(x) 

如果进入else语句,它将保持循环? 例如:循环继续进行后

“提供的选项包括:

意向

清单

键入q退出

你选择什么样的选项:” < - 这将滚滚而来以及我选择的功能。

+0

方法是如何进入的? – 2013-02-24 15:21:09

+0

因为它是一个常数,无限循环。 – Linuxios 2013-02-24 15:21:12

+0

会不会让它停止? – Dobz 2013-02-24 15:23:03

回答

1

你甚至不需要一个while循环来检查你正在检查的内容。使用这个来代替:

def Help(string): 
    if string == 'Manifest': 
     return Manifest() 
    elif string == 'Intent': 
     return Intent() 
    else: 
     print('The options available are:\n%s\nType Q to Quit\n' % '\n'.join(andHelp)) 
     x = input('What option do you choose: ') 
     print('\n') 
     if x != 'Q': 
      Help(x) 

注:我修改上设置打印位,以减少真正的,也没必要在那里多余的线条。
note2:正如您在评论中可能看到的那样,由于您可能会达到最大深度级别,因此递归执行此操作可能会非常危险。

+2

是的,当我进入“猫尿”1001次会发生什么。你的程序爆炸了! – 2013-02-24 15:26:37

+0

谢谢!对Python来说有点新鲜,所以我没有看到明显的答案。 :) 谢谢! – Dobz 2013-02-24 15:27:18

+0

@JakobBowyer对不起,但这不是一个错误,它是设计。如果OP想要限制他所选择的重试尝试,那么代码将执行OP所期望的操作,直到输入'Q'或'Manifest'或'Intent',才会继续询问输入。无论如何,不​​断输入“猫尿”不会爆炸任何东西,只是一个非常漫长的烦人循环。 – 2013-02-24 15:30:18

1

您的实际问题是由于您的递归实际上并未返回内部框架的值,但消除递归似乎是更直接的解决方案。

这是什么愚蠢的是做一个循环内的递归。递归和循环都用于相同的目的:使option选择继续发生,直到给出有效的选项。所以,你绝对可以消除一个:

def Help(string): 
    while True: 
     if string == 'Manifest': 
      return Manifest() 
      break 
     elif string == 'Intent': 
      return Intent() 
      break 
     else: 
      print('The options available are: \n') 
      for i in andHelp: 
       print(i) 
      print('Type Q to Quit \n') 
      string = input('What option do you choose: ') # Change `x` to `string` so next iteration will change behavior 
      print('\n') 
      if string == 'Q': 
       break 

由于Inbar Rose's answer指出,可以缩短这个颇有几分递归,但因为Python需要一个递归限制,你可以迫使它再次出现超出使程序崩溃限制。所以或许坚持循环更好。无论如何,您可以通过验证string作为回路本身的条件来进一步清理它:

def Help(string): 
    validOptions = ('Manifest', 'Intent', 'Q') 

    while string not in validOptions: 
     print('The options available are: \n') 
     for i in andHelp: 
      print(i) 
     print('Type Q to Quit \n') 
     string = input('What option do you choose: ') 
     print('\n') 

    # Now you have a guaranteed-valid string, so you don't need this part in the loop. 
    if string == 'Manifest': 
     return Manifest() # No need for a 'break' after a return. It's [dead code](http://en.wikipedia.org/wiki/Dead_code) 
    elif string == 'Intent': 
     return Intent() 
    elif string == 'Q': 
     return 
+0

谢谢:)总是寻找改进代码:) – Dobz 2013-03-06 23:51:55