2012-05-06 9 views
7

私はPythonがブーリアンステートメントをどのように評価するのか混乱しています。ブール演算

例:これが評価されてどのように

False and 2 or 3 

戻り3

?私はPythonが最初に 'False and 2'を見て、Falseを返しても '3'を見ていないと考えました。 Pythonがここで見るものの順序は何ですか?

もう一つは、次のとおりです。

1 or False and 2 or 2 and 0 or 0 

リターン1

私は最初の例から集められたところでは、その後、1を返します、私はPythonが左から右に評価するだろうと思ったので、「1またはFalse」 '1と2'は2を返し、2や2は最初の2を返し、2と0は0を返し、0または0は2番目の0を返します。

私はここでかなり混乱していると教えてください、助けてください!

ありがとうございます!

答えて

9

andは、orよりも高い優先度を持ちます。最初の部分(False and 2)Falseあるので

False and 2 or 3 

((False and 2) or 3) 

として評価され、Pythonは全体の状態がまだTrueかになることができるかどうかを確認するために、第2の部分を評価しなければなりません。 3Trueと評価されるので、このオペランドが返されます。

1Trueに評価されるので、全体の状態が True、他のオペランドが持っている値に関係なくなり

(1 or ((False and 2) or ((2 and 0) or 0))) 

として評価さ1 or False and 2 or 2 and 0 or 0ための同様

。Pythonはこの時点で評価をやめ、最終値を決定するオペランドを返します。

早ければ最終結果が決定されるshort-circuit evaluation呼ばれ、次のように説明することができる停止:

発現の最終結果が決定されるたびに、評価は、そのオペランドの値を停止し、Pythonでさ最終的な値が返されると判断します。 orオペレータ用andオペレータ、False(又は最後)に評価一番左のオペランド

  • 、最も左のため

    • :すなわち、左から右への評価を想定し、ありますTrue(または最後の1)と評価されたオペランド
  • +0

    ああそうなので、比較は任意のもので、括弧で囲む必要があります。それははるかに理にかなっています。 (1または(Falseおよび2)または(2および0)または0)の代わりに、どのようにして(1または((Falseおよび2)または(2および0))または0) – kkSlider

    +1

    @kkSlider優先順位を変更する必要がある場合、または通常の数学の場合と同様に、優先順位を変更する必要がある場合、または優先順位を変更したい場合のみ。過度のブラケティングは、コードをあまり明確にしません。あなたの例についてそれはあなたの状況にどのような論理があるのか​​という問題です。 –

    +0

    @kkSlider:特定の注文を強制したくない場合でもありません。しかし、式を 'Falseと(2 or 3)'として評価しなければならない場合は、それが必要です。 *編集:* @Lattywareが言ったこと:) –

    3

    ここでの問題は、評価のための注文があり、and has a higher precedence than orです。したがって、ここでは左から右に評価されます。

    この場合、False and 2 or 3は、Pythonには、(False and 2) or 3です - False or True、次にTrueに評価されます。あなたの次の例では

    、Pythonの短絡、そう1 or False1が行うようにTrueに評価され、そのため1を返します。残りは評価されません。これはorの一部がTrueであるかのように理にかなっています。これをチェックする

    良い方法は、印刷機能を定義することです:

    >>> def test(x): 
    ...  print("Test: "+str(x)) 
    ...  return x 
    ... 
    >>> test(1) or test(0) or test(3) 
    Test: 1 
    1 
    >>> test(0) or test(0) or test(3) 
    Test: 0 
    Test: 0 
    Test: 3 
    3 
    >>> test(False) and test(2) or test(3) 
    Test: False 
    Test: 3 
    3 
    >>> test(1) or test(False) and test(2) or test(2) and test(0) or test(0) 
    Test: 1 
    1 
    

    これが評価されますかを確認することが容易になり、どのような順序で。

    3

    このページのセクション5.15をチェックアウト:http://docs.python.org/reference/expressions.html

    orがより低いも優​​先を持っていますand、あなたの文は、私はしばらく前にPythonのドキュメントページでこれについて読ん

    (false and 2) or 3 
    
    2

    として評価されるように。見つけたら、私は参照を投稿します。 これは、boolean文の行に沿って何かを述べました。Pythonは最初のTrueオブジェクトを返します。それゆえに、とは、Falseで事前に偽造されていたが、3つの議論しかなかった(真)。これは、そのように評価され

    +0

    私はここでいくつかの悪いタイプをしていましたが、他の人が触れたように、最初のステップはブールの優先順位です、そして次はPythonがTrueまたはステートメントではFalseですが、実際の値(TrueまたはFalseを持つ可能性があります)。 – jheld

    2

    result = (False and 2) or 3 
    

    False and 2が本当っぽいですのであれば基本的には、それ以外の場合は3が返され、返されます。