Python >> python チュートリアル >  >> Python

Python または演算子

Python の or 演算子は、True を返す論理 OR 演算を実行します 少なくとも 1 つのオペランドが True と評価される場合 .オペレータはショートサーキットと呼ばれる最適化を実行します 、したがって、最初のオペランドが True に評価される場合 、2番目をさらに評価せずに最初のオペランドをすぐに返し、最初のオペランドが False と評価された場合 、2 番目のオペランドを返します。

記事を読みながら、補足説明のビデオもご覧ください:

Python または演算子 – ブール値

これが or の結果です ブールオペランドに適用された場合の演算子:

最初のオペランド A 第 2 オペランド B A または B
間違っている 間違っている
はい はい
はい 間違っている はい
はい はい はい

これらの例は、次のスクリプトで確認できます:

>>> False or False
False
>>> False or True
True
>>> True or False
True
>>> True or True
False

Python または演算子 – 整数の場合

or を適用することもできます 整数への演算子:

最初のオペランド A 第 2 オペランド B A または B
0 0 0
0 1 1
1 0 1
1 1 1

次の Python スクリプトでも同じことがわかります:

>>> 0 or 0
0
>>> 0 or 1
0
>>> 1 or 0
0
>>> 1 or 1
1

Python またはオペレーター – オブジェクトについて

興味深いことに、任意の Python オブジェクトに論理 OR 演算子を適用することもできます。基本的な考え方は、Python オブジェクトの「真実性」です。つまり、すべての Python オブジェクトには、__bool__() によって決定される関連付けられたブール値があります。 魔法の方法。

次のコードでは、My_Obj というカスタム クラスを作成します。 「or」を使用します ” このクラスのインスタンスに対する演算子。

>>> class My_Obj:
	None

	
>>> My_Obj() or My_Obj()
<__main__.My_Obj object at 0x0000025108D897F0>
>>> 0 or My_Obj()
<__main__.My_Obj object at 0x0000025108D897F0>
>>> 1 or My_Obj()
1

一部の出力が奇妙に見えるのはなぜかと思うかもしれません。理由は簡単です:すべてのカスタム オブジェクトには暗黙的なブール値が関連付けられています:

>>> bool(My_Obj())
True

or の第 1 オペランドの場合 操作は False に評価されます 、Python は短絡を実行します つまり、すぐに 2 番目のオペランドを返します。 2 番目のオペランドが全体的な結果を論理的に決定するため、これは理にかなっています (以下の表を参照してください。最初のオペランドは False です)。 )。

最初のオペランド A 第 2 オペランド B A または B
はい はい

したがって、2 番目のオペランドを評価する必要さえありません。Python はそれを変更せずに単に返します。だから or の結果は operation は、ブール値の代わりにカスタム オブジェクトにすることができます。

Python または演算子 – リスト上

or を適用できます リストを含む任意のオブジェクトに対する演算子。すべてのリスト オブジェクトには、bool(list) によって決定されるブール値が関連付けられています。 method — すべてのリストは True と評価されます 空のリストを除いて。 or を適用した場合 2 つのリストに対する演算子で、Python は最初のリストが空でない場合 (ショートサーキット により) を返します。 )、それ以外の場合は 2 番目のリスト。

>>> [1, 2, 3] or [4, 5, 6]
[1, 2, 3]
>>> [] or [4, 5, 6]
[4, 5, 6]
>>> [1, 2, 3] or []
[1, 2, 3]
>>> [] or []
[]

したがって、Python or を使用します。 たとえば、多数のバックアップ リスト (2 番目、3 番目、4 番目など) があり、それらが空の場合に優先度の高いリストの代わりに使用する必要がある場合などです。

Python またはオペレーターの短絡

短絡は、次の観察を使用するプログラミング言語で一般的な最適化です:最初の演算子が True に評価される場合 、 or 全体 式は True に評価される必要があります それも。したがって、論理式全体の結果を知るために後続のオペランドを評価する必要はありません。最初のオペランドが False の場合のみ 、さらに 2 番目のオペランドに移動し、場合によっては 3 番目などに移動します。これにより、複雑な論理式を評価する際の時間を大幅に節約できます。

or での短絡の最小限の例 演算子はここに表示されます:

>>> True or print('Am I evaluated?')
True 
>>> False or print('Am I evaluated?')
Am I evaluated?

2 番目のオペランドが短絡最適化のために評価されるかどうかを確認する簡単なトリックを使用します — 2 番目のオペランドは print() です 常に None を返すステートメント ただし、実行すると目に見える副作用が発生します。最初の例では、最初のオペランドが式全体の結果をすでに決定しているため、評価されていないことがわかります。しかし、2 番目の例では、最初のオペランドが式全体の結果に対する決定的な答えを提供しないため、評価されます。

Python または演算子 vs |

Python の「or ” 演算子は、True を返す論理 OR 演算を実行します 1 つ以上のオペランドが True の場合 . Python の「| 」 シンボルは、オペランドのビット表現に作用し、ビットごとの演算を実行するビット単位の演算子です。つまり、「or 」は、少なくとも 1 つのオペランドが論理的に True であるかどうかをテストします 一方、「| ” は、オペランドに対してビットごとの OR 演算を実行します。

ブール値を比較する場合など、意味的に単一ビットのみを考慮する場合、演算子は同じです:

>>> True or False
True
>>> True | False
True

ただし、整数オペランドを使用すると違いが明らかになります:

>>> 32 or 16
32
>>> 32 | 16
48

最初の式 32 or 16 整数値 32 がブール値の True に関連付けられていると判断します であるため、短絡最適化を実行すると、最初のオペランド 32 が返されます。

2 番目の式 32 | 16 ビット表現 10000 (10 進数 32) と 01000 (10 進数 16) を操作し、ビットごとの OR を実行します。結果は、10 進数の 48 を表すビット表現 11000 です。

最初のオペランド A 1 0 0 0 0 0
第 2 オペランド B 0 1 0 0 0 0
あ | B 1 1 0 0 0 0

同様に、ビットごとの OR 演算子を紹介する別の例を見てみましょう:

>>> 31 | 15
31

これは、次の視覚化で確認できます:

最初のオペランド A 1 1 1 1 1
第 2 オペランド B 0 1 1 1 1
あ | B 1 1 1 1 1

ビット シーケンス 11111 の 10 進数表現は 31 です。

Python またはオペレーターの評価順序

Python は、右オペランドの前に左を評価します。論理 and を含む式を評価するときにショートサーキットを使用します または or そのため、結果を決定する必要がない限り、2 番目のオペランドは評価されません。論理的な and 論理 or の前に優先されます .

次の例では、「and」演算子が「or」演算子よりも優先されるため、最初に評価されることがわかります。

>>> False and False or True
True
>>> (False and False) or True
True
>>> False and (False or True)
False

同じ優先順位がここで確認できます:

>>> True or False and False
True
>>> (True or False) and False
False
>>> True or (False and False)
True

これはまた、多くの人が誤って想定していること、つまり先着順のオペレーターの優先順位があることを除外します。この例では、「or」演算子が最初に評価されますが、最後に評価されます。

If 条件の Python または演算子

if 条件で論理 OR 演算子を使用する場合は、キーワード or を使用します。 二重の || の代わりに Java または C++ の論理 OR としてご存知かもしれません。例:if A or B if A || B に対して正しいでしょう 間違っているでしょう。

if 条件での論理 AND の正しい使い方は次のとおりです。

# YES!
if 2+2 == 4 or 2-2 == 0:
    print('YES!')

このコード スニペットの結果は 'YES!' です .

C++ または Java コーダーが Python に移行する際の間違った方法は次のとおりです。

# NO!
if 2+2 == 4 || 2-2 == 0:
    print('NO!')

このコード スニペットの結果は SyntaxError です :

これを解決するには、誤った二重記号 || を置き換えるだけです 正しいキーワード or で .

論理演算子

論理演算子はブール比較を実行するためのショートカットですが、整数やその他のオブジェクトにも使用できます。

演算子 説明
and True を返します 両方のオペランドが True の場合 、および False (True and True) == True
or True を返します 2 つのオペランドの少なくとも 1 つが True の場合 、および False (False or True) == True
not True を返します 単一オペランドが False の場合 、および False (not True) == False