Python 循环执行后继续运行

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

如果它进入else语句,为什么会继续循环? 例如:

“可供选择的方案有:

意图

显示

键入Q退出


您选择什么选项:“您甚至不需要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