2013-03-22 9 views
6

in文を使用してif文をよりうまく動作させる方法を学ぶために、この不要な複雑なコードを書きました。コードスニペットに続いて2つの質問があります。Pythonの "in"文が自動的にtrueに戻ります

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と思います。それは誰にも分かりますか?

2番目の質問:上記のコードは、ansが実際にanswerまたはanswer2にあるかどうかによって異なる3行を返します。

if ans in answer[i] == True:

これは、コード出力にのみelse:文を作るの不思議な効果を持っていた:私はそうのような関連部分を交換することにより、その排除しようとしました。だから誰でも私にはどのようにif ans in answer[i]:if ans in answer[i] == True:をどう解釈するの違いを説明することができますか?

答えて

5

限りans in answer[i]ans in answer[i] == Trueとの間の差として、簡単:Pythonの文字列がTrueに等しくないので、当然のことながら、虚偽である、ans in answer[i] and answer[i] == Trueのうち後者の形式を展開します。

単純な例では、このことを説明するのに役立つことがあります。括弧を追加すると動作がどのように変化するか

>>> 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またはFalseを明示的にチェックするのは貧弱なスタイルとみなされます。if x in yを書く方がはるかに優れています。

15

逆の順序で質問に答えるために、Trueと明示的に比較した理由は、あなたが期待した表現をPythonが解釈しなかったということです。 Pythonのパーサを使用すると、このように、それらを一緒に連鎖し、賢明な結果を得ることができるように式を比較する特別な処理があります。

Pythonは、一回の操作として、この全体のことを処理するために持っていることを
>>> "a" == "a" == "a" 
True 

お知らせあなたがそれを分割している場合ので、

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

カッコ内の一部が最初に評価され、Trueを返しますが、True != "a"ので、式全体がfalseを返しているため、これらの動作が異なる2つの操作は、同じ結果を得ることはありませんいずれかの方法に。

上記の権利によって、上記は実際にあなたのプログラムに何の影響も与えてはなりません。次のようにPythonは実際にそれを評価して残念ながら、Pythonは、あなたが一緒にこれらをチェーンときにそれらは上記のようなシーケンスとして解釈され==と同じ機構を介してinを処理します。

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

それは奇抜と間違いなく直感的です、残念ながら、それはどのように動作するのですか?あなたは別に最初の部分を評価するためのPythonを強制するために括弧を使用する必要が望んでいた動作を取得するには:あなたが疑われるとして、式はすでにブール値を返します、ので

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

を言ったのすべてと、== Trueは冗長ですそしてifステートメントは、それをそのまま評価することができます。

今あなたの他の問題に戻るには、入力行を1行取り、ユーザーが入力した内容に応じて1行の出力を生成すると思います。入力文字列のいずれかに一致した場合

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" 

この最初のテスト:あなたは完全にあなたのforループを排除することを可能にする文字列と文字列がリストにあるかどうかを確認するために、リストにinオペレータを適用することができますanswerでは、answer2と同じです。もちろん、同様の効果を得ることができますが、入力を小文字に変換して小文字に変換するだけで、YeSのような他の形式もサポートできます。

関連する問題