循环继续进行后
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退出
你选择什么样的选项:” < - 这将滚滚而来以及我选择的功能。
你甚至不需要一个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:正如您在评论中可能看到的那样,由于您可能会达到最大深度级别,因此递归执行此操作可能会非常危险。
是的,当我进入“猫尿”1001次会发生什么。你的程序爆炸了! – 2013-02-24 15:26:37
谢谢!对Python来说有点新鲜,所以我没有看到明显的答案。 :) 谢谢! – Dobz 2013-02-24 15:27:18
@JakobBowyer对不起,但这不是一个错误,它是设计。如果OP想要限制他所选择的重试尝试,那么代码将执行OP所期望的操作,直到输入'Q'或'Manifest'或'Intent',才会继续询问输入。无论如何,不断输入“猫尿”不会爆炸任何东西,只是一个非常漫长的烦人循环。 – 2013-02-24 15:30:18
您的实际问题是由于您的递归实际上并未返回内部框架的值,但消除递归似乎是更直接的解决方案。
这是什么愚蠢的是做一个循环内的递归。递归和循环都用于相同的目的:使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
谢谢:)总是寻找改进代码:) – Dobz 2013-03-06 23:51:55
方法是如何进入的? – 2013-02-24 15:21:09
因为它是一个常数,无限循环。 – Linuxios 2013-02-24 15:21:12
会不会让它停止? – Dobz 2013-02-24 15:23:03