2013-11-04 13 views
5

私はPythonの初心者ですが、Pythonの論理文を試しています。私は理解できませんでした。誰も私にここで何が起きているのか教えてください。 Pythonでは偽の値です。ブール代数Pythonの値の混乱

 
>>> 0 or False 
False 
>>> False or 0 
0 

なぜインタープリタが異なる回答をしていますか?

+0

これらの値の両方が「偽」であることに注意してください。つまり、両方ともif文で 'False'と評価されます。 –

答えて

6

or演算子の動作が混乱しています。 の場合にのみ最初の式を返します。の値です。第二の値が返されるようにも0Falseは真である:

>>> 0 or 'bar' 
'bar' 
>>> False or 'foo' 
'foo' 

0の数値ではない任意の値、空の容器、None又はFalseは(カスタムクラスは、__bool__方法を実装することによってそれを変えることができる(真であると考えられますパイソン3)、__nonzero__(パイソン2)または__len__(長さ0)は空である

第二の発現も評価されていない最初のTrueある場合:。

>>> True or 1/0 
True 

1/0の式ではZeroDivision例外が発生しますが、Pythonでは評価されません。

これはboolean operators documentationに記載されている:

発現x or y最初xを評価します。 xが真の場合、その値が返されます。それ以外の場合はyが評価され、結果の値が返されます。

同様に、andは、Falseの場合は最初の式を返し、それ以外の場合は2番目の式が返されます。

+0

"真である最初の式を返します" ここで0またはFalse Falseはどのように真ですか? –

+0

私はこの答えが好きではありません。なぜなら、「最初の式がTrueで返されます」という正当性は、その動作を完全に説明していないからです。何か「オペランドを通り、真である最初の式、または最後に検出されたオペランドを返す」というようなものは、あまりエレガントではなく、遭遇した動作をよりよく説明するでしょう。 –

+0

@WaleedKhan:表現を調整しました。 –

1

この動作の性質は、Pythonの順序でexpression evaluationです。 Pythonは式を左から右へと評価します、それはlazy mannerでそれを行います。つまり、式の値がTrueの場合、式の残りの部分に関係なく、式に関連付けられたワークフローの分岐に従います。式のどれもTrueでない場合は、の最新のもの(最後のもの)が返されます。これにより、計算資源を節約できるという利点がある。次のコードを考えてみましょう:range(10**8)が、この場合に呼び出されることはありませんことを、

>>>False or False or True or range(10**8) 
True 
>>> 

注意を、それゆえ、多くの時間が保存されます。