Python 循环执行后继续运行
如果它进入else语句,为什么会继续循环? 例如: “可供选择的方案有: 意图 显示 键入Q退出Python 循环执行后继续运行,python,python-3.x,while-loop,break,python-3.3,Python,Python 3.x,While Loop,Break,Python 3.3,如果它进入else语句,为什么会继续循环? 例如: “可供选择的方案有: 意图 显示 键入Q退出 您选择什么选项:“您甚至不需要while循环来检查所检查的内容。改用这个: def Help(string): while True: if string == 'Manifest': return Manifest() break elif string == 'Intent': ret
您选择什么选项:“您甚至不需要while循环来检查所检查的内容。改用这个:
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)
注意:我对您的打印进行了一些修改,以减少实际上不需要的额外线条。注2:正如您在注释中所看到的,无限制地递归执行此操作可能会很危险,因为您可能会达到最大深度级别。您的实际问题是由于递归没有实际返回内部帧的值,但消除递归似乎是一个更简单的解决方案 愚蠢的是在循环中进行递归。递归和循环都有相同的用途:使
选项
选择一直发生,直到给出有效的选项为止。因此,您完全可以消除一个:
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)
正如所指出的,您可以通过递归将其缩短很多,但是由于Python需要递归限制,您可以通过强制程序在超出该限制的情况下重复来使程序崩溃。因此,也许坚持循环更好。无论如何,您可以通过将string
的验证作为循环本身的条件来进一步清理它:
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
这个方法首先是如何输入的?因为它是一个常数,无限循环。中断不会使它停止吗?你输入了“q”(小q)吗?如果x.upper()=='Q',请尝试。另外,不要再次调用Help(),您已经在while循环中介绍了这一点。你最终会得到嵌套调用,这些调用在打开时会不断询问问题。无论如何,递归似乎是不必要的。不要调用
帮助(x)
,只需设置string=x
,让循环返回到开头。是的,当我输入“猫尿”1001次时会发生什么。你的程序爆炸了!非常感谢。只是对Python有点陌生,所以我看不到明显的答案。:)谢谢@对不起,这不是错误,这是设计。如果OP希望限制重试尝试(这是他的选择),那么代码会按照OP的预期执行,不断请求输入,直到输入“Q”或“Manifest”或“Intent”。无论如何,“猫尿”
的持续输入不会爆炸任何东西,只是一个很长的恼人的周期。@InbarRose:实际上,由于Python的递归限制,它会崩溃。您自己试试看(尽管您可能想先用sys.setrecursionlimit
降低递归限制,以节省时间)。因此,由于用户输入而导致的递归可能性通常被视为设计缺陷,如果为True:[…]则首选中断
循环。@DSM您完全正确,我没有想到这一点。递归是易变的B****。我将在答案中添加注释。谢谢:)一直在寻找改进代码:)
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