6

inステートメントをより適切に機能させるためにステートメントを使用する方法を学習する途中で、この不必要に複雑なコードを少し書きifました。コード スニペットの後に 2 つの質問があります。

answer = ['Yes', 'yes', 'YES']
answer2 = ['No', 'no', 'NO']
ans = raw_input()
for i in range(0, 3):
    if ans in answer[i]:
        print "Yes!"
    elif ans in answer2[i]:
        print "No!"
    else:
        print "Don't know what that means"

if n in listname:最初の質問: True または False が自動的に返されると思います。それが事実かどうか誰かが知っていますか?

ans2 番目の質問: 上記のコードは、が実際にanswerまたはにあるかどうかによって異なる 3 行を返しますanswer2。関連する部分を次のように置き換えることで、それを排除しようとしました。

if ans in answer[i] == True:

これにより、コードがelse:ステートメントのみを出力するという奇妙な効果がありました。if ans in answer[i]:では、python の解釈方法との違いを説明してくれる人はいif ans in answer[i] == True:ますか?

4

2 に答える 2

15

True逆の順序で質問に答えると、との明示的な比較が機能しなかった理由は、Python が期待どおりに式を解釈しなかったためです。Python パーサーには比較式の特別な処理があるため、次のようにそれらを連結して適切な結果を得ることができます。

>>> "a" == "a" == "a"
True

Python は、この全体を 1 つの操作として扱わなければならないことに注意してください。どちらの方法でも 2 つの操作に分割すると、同じ結果が得られないからです。

>>> ("a" == "a") == "a"
False
>>> "a" == ("a" == "a")
False

かっこ内の部分が最初に評価されて を返すため、これらの動作は異なりますがTrueTrue != "a"式全体は false を返します。

当然のことながら、上記は実際にはプログラムにまったく影響を与えるべきではありません。残念ながら、Python はinと同じメカニズムで処理==するため、これらをチェーンすると上記のようなシーケンスとして解釈されるため、Python は実際には次のように評価します。

>> "a" in ["a"] == True
False
>>> ("a" in ["a"]) and ("a" == True)
False

風変わりで間違いなく直感に反していますが、残念ながらそれが機能する方法です。必要な動作を得るには、括弧を使用して Python に最初の部分を個別に評価させる必要があります。

>>> ("a" in ["a"]) == True
True

そうは言っても、== Trueあなたが疑ったように、式はすでにブール値を返し、ifステートメントはそれをそのまま評価できるため、冗長です。

あなたの他の問題に戻るには、あなたがやろうとしていることは、1行の入力を取り、ユーザーが入力した内容に応じて対応する1行の出力を生成することだと思います。演算子を文字列とリストに適用しinて、文字列がリストに含まれているかどうかを確認できます。これにより、forループを完全に排除できます。

answer = ['Yes', 'yes', 'YES']
answer2 = ['No', 'no', 'NO']
ans = raw_input()
if ans in answer:
    print "Yes!"
elif ans in answer2:
    print "No!"
else:
    print "Don't know what that means"

これは、最初に入力が の文字列のいずれかと一致するかどうかをテストしanswer、次に についても同じですanswer2。もちろん、同様の効果を達成できますがYeS、入力を小文字に変換して小文字の形式と比較するだけで、他の形式もサポートできます。

if ans.lower() == "yes":
    print "Yes!"
# (and so forth)
于 2013-03-22T06:19:14.877 に答える
5

ans in answer[i]との違いはans in answer[i] == True単純です。Python は後者の形式を に展開しますans in answer[i] and answer[i] == True。これはもちろん、文字列が と等しくないため FalseTrueです。

より簡単な例は、これを説明するのに役立ちます:

>>> a = [1, 2, 3]
>>> 2 in a
True
>>> 2 in a == True
False
>>> 2 in a and a == True
False
>>> (2 in a) == True
True
>>> 2 in a == [1, 2, 3]
True
>>> 2 in a and a == [1, 2, 3]
True

1 < x < 5括弧を追加すると動作がどのように変化するかに注意してください。これは、 ではなく、 のような展開に似てい(1 < x) < 5ます。

True補足として、 orを明示的にチェックするのは、一般的にスタイルが悪いと考えられてFalseいますif x in y

于 2013-03-22T06:13:28.643 に答える