0

問題の簡単な解決策が本当に見つからないので、簡単な質問です。整数であることが意図されているユーザー入力を取得する方法はありますが、文字列が入力されると、プログラムは中断せず、代わりに「エラー」を表示します

文字列を整数に、またはその逆に変換することで回避しようとしていますが、常に「基数10のint()の無効なリテラル」エラーが発生するか、「エラー」が表示されると無限ループで発生します。 。

これが質問をクリアするのに役立つ私のコードです

choice = input("Enter your choice: ")

while choice != 3:
    if choice == 1:
        get_songs()
        print
        main()
    elif choice == 2:
        read_songs()
        print
        main()
    else:
        print "Invalid choice"

したがって、基本的には、else操作が文字列に対しても、3より大きいまたは1より小さい整数に対しても機能するようにしたいのです。

4

4 に答える 4

9

しかし、私は常に「10進数のint()の無効なリテラル」エラーを受け取ります

例外が発生します。具体的にはValueErrorexceptブロックを使用して例外をキャッチできます。詳細については、これまで使用してきた言語チュートリアルを参照するか、Googleforを試してくださいexcept block Python

「エラー」と表示される場合は、無限ループで表示されます。

入力が正しくないことを検出した場合は、ループを再試行する前に新しい入力を取得する必要があります。入力を取得するものをループ内に配置します。ループに加えて再帰(内部からの呼び出し)を使用しないでください。あなたはこのように自分自身を混乱させるだけです。ループ内に入るまで値を取得しないため、適切な値を見つけたときに、ループを制御しようとする(つまり、条件でテストする)よりも、明示的にループから外れる方が簡単です。 。main()mainchoicebreakchoicewhile

ループ構造を単純化するために使用することもできます。ブロックcontinue内のすべての作業を行う代わりにtry、数値を抽出する部分に限定します。ブロック内で使用continueexceptて、実際の番号がない場合はループの残りの部分をスキップし、ループの残りの部分は実行する場合にのみ実行します。(結局のところ、私たちが要求するコード、choice == 1またはまったく異なる理由で発生choice == 2する可能性のあるコードraise ValueErrorであり、それについて別のことをしたいと思います。)

while True:
    try:
        choice = int(raw_input("Give me a number"))
    except ValueError:
        print "Could you at least give me an actual number?"
        continue

    if choice == 1:
        do_something()
    elif choice == 2:
        do_something_else()
    elif choice == 3:
        break
    else:
        print "Try a different number"
于 2012-05-31T03:37:22.983 に答える
0

その選択は常に!= 3なので、無限ループになります。「else」状態にジャンプした場合は、再度入力を取得する必要があります。

于 2012-05-31T03:32:51.937 に答える
0

""ここに何かがあります:私はユーザーに文字列の周りに入力させるのが嫌いです。

ch = raw_input("Enter choice: ")
#ch *is* a string at this point
if ch.isdigit():
   choice = int(ch)
else:
    print "Invalid choice"

編集(コメントから):

isdigitロケールエンコーディングを正しく処理できない場合があります。Python 3では、代わりに使用できますisdecimal。—JFセバスティアン

于 2012-05-31T03:32:53.437 に答える
0

コードでは、whileループで行をカプセル化する必要がありますinput()。ただし、以下はより明確な代替手段です。

ユーザー入力を取得する関数を作成します。

def getInteger(prompt):
    while True:
        userIn = input(prompt)
        try:
            return int(userIn)
        except ValueError:
            print "Error"
于 2012-05-31T03:33:08.447 に答える