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 を入力して終了します

どのオプションを選択しますか: " <-- これは、私が選択した機能と同様に出てきます。

4

2 に答える 2

1

実際の問題は、再帰が実際には内部フレームの値を返さないことが原因ですが、再帰を排除する方がより簡単な解決策のようです。

これについて間抜けなのは、ループ内で再帰を実行することです。再帰とループはどちらも同じ目的を果たしoptionます。有効なオプションが指定されるまで、選択を継続することです。したがって、1つを確実に排除できます。

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の回答が指摘しているように、再帰を使用してこれをかなり短縮できますが、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
于 2013-02-24T15:57:10.797 に答える
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)

注:実際にそこにある必要のない余分な行を減らすために、プリントを少し変更しました。
注2:コメントにあるように、最大​​深度レベルに達する可能性があるため、制限なしで再帰的にこれを行うのは危険な場合があります。

于 2013-02-24T15:24:48.647 に答える