1. ホーム
  2. python

[解決済み] Pythonテキストメニューの無限ループ

2022-02-08 13:58:28

質問

Pythonで簡単なテキストメニューを作っているのですが、メニューのためのwhileループに入るたびに無限ループになってしまいます。私はこれが正しく動作するように感じるので、何が起こっているのかよくわかりません。

 # Menu system!
def menu():
        print "blahblah options"

loop = 1
choice = 0
while loop == 1:
    choice = menu()
    if choice == 1:
        add(input("Add this: "),input("to this: "))
    elif choice == 2:
        sub(input("Subtract this: "),input("from this: "))
    elif choice == 3:
        mul(input("Multiply this: "),input("by this: "))
    elif choice == 4:
        div(input("Divide this: "),input("by this: "))
    elif choice == 5:
        loop = 0

ここで、一番上のprintステートメントを延々とループさせる原因は何なのでしょうか?

解決方法は?

の行が足りません。 menu または input を他の場所に移動します。まだユーザーからの選択を受け入れていないのです。もし、今の構造を維持したいのであれば menu のようにする必要があります。

def menu():
    print 'options...'
    return int(raw_input())

あるいは、もう少しきれいに(同じ効果)。

def menu():
    return int(raw_input('options...'))

そうでない場合は、単に menu() で、別途ユーザーの選択を受け付ける。

while loop == 1:
    menu()
    choice = int(raw_input())

備考 を変更したこと。 input() の呼び出しを int(raw_input()) . これは だいぶ 入力に任意の Python コードを埋め込むことができないので、ユーザーからの入力を受け取るより安全な方法です!


ノットオントピック。

さて、たまたま気がついたからということで、次のことも書いておきます。 loop は誤解を招く可能性のある変数名です。ブール値として使っているだけなので、whileループをこんな風に書き換えてみてはどうでしょう。

loop = 1
while loop: # !
    #do stuff

これはちょっと面白いのですが、読んでいてあまり直感的ではありません。通常は、単純に無限にループして break を使用すると、終了条件を満たしたときに

while True:
    # Do stuff
    if choice == 5: #Or whatever end condition
        break