2

私はPythonを学ぼうとしていますが、自分の学習目的で「クイズ」をプログラミングしているときに、この信じられないほど奇妙な異常に遭遇しました。ブール「または」関数は少し奇妙に動作しています。コードの一部は次のとおりです。

def answercheck(answer):
    solved = 0
    while solved == 0:
        useranswer = raw_input("> ")
        if useranswer == answer:
            solved = 1
            correct()
        elif useranswer == "A" or "B" or "C" or "D":
            solved = 1
            incorrect()
        else:
            print "False input. Try again."

これが何が起こるかです。クイズの質問がクイズの出場者に出力された後、実際の回答を引数として回答チェック関数が呼び出されます。次に、ユーザーは回答を求められます。有効な答えは「A」、「B」、「C」、「D」だけにしたいので、「while」ループに入れました。

したがって、誰かがraw_inputを介して「useranswer」を「lol」のように役に立たないものにすると、「A」、「B」、「C」、または「D」が回答として挿入されるまで、ユーザーに再度プロンプトが表示されるのではないかと思います。ただし、そうではなく、「答え」ではない答えは正しくないと見なされます。

だから私はそれを少し書き直しました、そして私がこれをするときそれはうまくいくように見えます:

def answercheck(answer):
    solved = 0
    while solved == 0:
        useranswer = raw_input("> ")
        if useranswer == answer:
            solved = 1
            correct()
        elif useranswer == "A":
            solved = 1
            incorrect()
        elif useranswer == "B":
            solved = 1
            incorrect()
        elif useranswer == "C":
            solved = 1
            incorrect()
        elif useranswer == "D":
            solved = 1
            incorrect()
        else:
            print "False input. Try again."

これは私には少し冗長に思えます。最初のスクリプトで何が問題になっていますか?

4

4 に答える 4

4

の正しい構文useranswer"A"、、、または"B""C""D"いずれかです。

elif useranswer in ("A", "B", "C", "D"):

または(Pythonのバージョンがsetリテラルをサポートするのに十分最近のものである場合):

elif useranswer in {"A", "B", "C", "D"}:

あなたが今持っているものは構文的に有効ですが、まったく異なる意味を持っています。

于 2013-03-05T17:30:55.697 に答える
3

or2つのブール変数で動作します。代替選択肢のセットは作成されません。これを試して:

useranswer == "A" or useranswer == "B" or useranswer == "C" or useranswer == "D"

または、より便利に:

useranswer in ("A", "B", "C", "D")

あるいは

useranswer in "ABCD"
于 2013-03-05T17:32:16.847 に答える
1

useranswer == "A" or "B" or "C" or "D"意味

(((useranswer == "A") or "B") or "C") or "D"

だからあなたが好きなように動作しないのです

于 2013-03-05T17:31:09.140 に答える
1

演算子の優先順位-useranswer == 'A'何にでも評価され、「B」、「C」、「D」は常に「True」に評価されます

あなたはこのようなことをする必要があります」

if useranswer in ['A', 'B', 'C', 'D']:
    ...
于 2013-03-05T17:32:58.893 に答える