私はPythonの初心者ですが、Pythonの論理文を試しています。私は理解できませんでした。誰も私にここで何が起きているのか教えてください。 Pythonでは偽の値です。ブール代数Pythonの値の混乱
>>> 0 or False False >>> False or 0 0
なぜインタープリタが異なる回答をしていますか?
私はPythonの初心者ですが、Pythonの論理文を試しています。私は理解できませんでした。誰も私にここで何が起きているのか教えてください。 Pythonでは偽の値です。ブール代数Pythonの値の混乱
>>> 0 or False False >>> False or 0 0
なぜインタープリタが異なる回答をしていますか?
or
演算子の動作が混乱しています。 の場合にのみ最初の式を返します。の値です。第二の値が返されるようにも0
もFalse
は真である:
>>> 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またはFalse Falseはどのように真ですか? –
私はこの答えが好きではありません。なぜなら、「最初の式がTrueで返されます」という正当性は、その動作を完全に説明していないからです。何か「オペランドを通り、真である最初の式、または最後に検出されたオペランドを返す」というようなものは、あまりエレガントではなく、遭遇した動作をよりよく説明するでしょう。 –
@WaleedKhan:表現を調整しました。 –
この動作の性質は、Pythonの順序でexpression evaluation
です。 Pythonは式を左から右へと評価します、それはlazy mannerでそれを行います。つまり、式の値がTrue
の場合、式の残りの部分に関係なく、式に関連付けられたワークフローの分岐に従います。式のどれもTrue
でない場合は、の最新のもの(最後のもの)が返されます。これにより、計算資源を節約できるという利点がある。次のコードを考えてみましょう:range(10**8)
が、この場合に呼び出されることはありませんことを、
>>>False or False or True or range(10**8)
True
>>>
注意を、それゆえ、多くの時間が保存されます。
これらの値の両方が「偽」であることに注意してください。つまり、両方ともif文で 'False'と評価されます。 –