OR演算子は Python に存在する 3 つの論理演算子 (
and,
or,
not`) の 1 つで、渡されたオペランドを論理的に評価するものです。
簡単に言うと、2つのオペランドが渡されると、論理式の最終的な値が True
か False
のどちらかを決定します。
最終的な論理式の値を評価する仕組みは、ブール代数として知られる一連の規則に基づいている。
このガイドでは、Pythonの or
演算子と、その最も一般的な使用例について説明します。
または オペレータの基本
Pythonの or
演算子は、与えられた2つのオペランドに対して論理和を実行するだけです。
オペランドが単純に2つのブール値であると仮定すると、 or
演算子の使い方のルールはとてもわかりやすいものになります。
2つのオペランドのどちらかが True
という値を持っていれば、式全体が True
という値になります。
それ以外の場合、式全体は False
という値を持ちます。
さて、次に or
演算子の真理値表を見てみましょう。
オペランド1 オペランド2 OR式の値 | ||
真|真|真|真|真|真 | ||
真|偽|真|の順 | ||
False | True | True |
偽|偽|偽|偽 |
この表は、論理和の法則を説明したものです。
この表から、or
演算子はオペランドの両方が同様に False
である場合にのみ、結果として False
を生成することがわかります。
これらのことから、遅延評価という概念が浮かび上がってきます。
数学的な演算の計算を最適化するために使われるメカニズムです。
このケースでは、 or
演算子を使ったブール式の評価処理を高速化するために使用されます。
我々はすでに、 or
式の2つのオペランドのどちらかが True
であれば、 True
値になることを知っています。
したがって、複数のオペランドからなるブール式では、それぞれのオペランドを個別に評価する必要は全くありません。
オペランドの値を次々に読み込んでいけばよいのです。
初めて True
に出会ったときは、他のオペランドをすべて無視して、式全体を True
として評価すれば安全です。
一方、True
という値を持つオペランドがない場合は、式全体をFalse
という値で評価しなければなりません。
これが遅延評価の基本的な考え方で、評価する必要がないときは評価しないようにします。
ブール型変数の使用またはブール型変数への適用
Python の or
演算子は、2 つのオペランドを評価するために使用されます。
このセクションでは、オペランドが両方ともブール値である場合に焦点を当てます。
場合によっては、or
演算子はブール値以外でも使用できますが、それについては次のセクションで説明します。
それでは、or
演算子を 2 つのブール値で使用する方法を見てみましょう。
# Two Boolean values
result1 = True or False # Expected to be `True`
result2 = False or False # Expected to be `False`
print('R1:', result1)
print('R2:', result2)
この例では、or
演算子がどのように単純なブール値のみからなる式を評価するのかがわかります。
前のセクションで説明したように、このコード片は次のような出力を持つことになります。
R1: True
R2: False
前の例では、ブール式の名前を result1
と result2
としました。
このようにして、それぞれ True
と False
という値を持つ 2 つのブール変数を作成しました。
この2つの変数は、別のブール式のオペランドとして使うことができるので、より複雑なブール式の部分式と考えることができます。
これが、より複雑なブール式を階層的に構築するために使われる一般的な原理です。
result3 = result1 or result2 # `True` or `False` <=> `True`
result4 = result3 or True # `True` or `True` <=> `True`
print('R3:', result3)
print('R4:', result4)
予想通り、これは出力されます。
R3: True
R4: True
result4` は複数の部分式とブール値からなる複雑なブール式です。
これを展開する過程を見てみよう。
1. result4 = result3 or True
2. result4 = (result1 or result2) or True
3. result4 = ((True or False) or (False or False)) or True
論理演算子 or
の連想法に基づいて、演算子を適用する順番はブール式の値に影響を与えないことが分かっているので、括弧は必要ありません。
したがって、括弧をすべて削除すれば、result4
をもう一段階変形することができます。
result4 = True or False or False or False or True
非ブール型変数の使用または非ブール型変数への適用
Python の or
演算子は Boolean 以外の変数でも使うことができます。
ブール型変数と非ブール型変数を混在させることもできます。
このセクションでは、異なるデータ型の変数に対する or
演算子の使い方を説明するいくつかの例について説明します。
一般的に、Python のオブジェクトや変数は、そのクラスが False
を返す __bool__()
メソッドや 0
を返す __len__()
メソッドを定義していなければ True
であるとみなされます。
簡単に言うと、 False
とみなされるオブジェクトは、 False
になるように定義されているか、空のリスト、タプル、文字列、辞書など、空であるものだけということになる。
Pythonの公式ドキュメントには、 False
とみなされる最も一般的な組み込みオブジェクトのリストが掲載されています。
- false と定義された定数:
None
とFalse
. - 任意の数値型のゼロ。0
,
0.0,
0j,
Decimal(0),
Fraction(0, 1)* 空のシーケンスとコレクション:
Noneと
False` です。 - 空のシーケンスとコレクション。空のシーケンスとコレクション:
''
,()
,[]
,{}
,set()
,range(0)
.
注意: これらはFalsy Valuesとも呼ばれ、直感的に False
というブール値に還元できるような値です。
その反対の値はTruthy Values(真実の値)である。
もう一つ非常に重要な事実は、この場合の or
演算子は、オブジェクトの True/False
値ではなく、実際のオブジェクトを返すということです。
では、上記の動作を説明する例を見てみましょう。
exp = {} or 'This is a string'
先に述べたように、最初のオペランド {}
(空の辞書) は False
と見なされ、2番目のオペランド 'This is a string'
(空の文字列ではない) は True
と見なされます。
これは、前の式が暗黙のうちに次のように変換されることを意味します。
# exp = False or True
ここで、exp
はTrue
と評価されます。
しかし、元の exp
の値を表示しようとすると、 True
ではなく、次のような出力になります。
'This is a string'
この例は、 or
演算子が True/False
値の代わりにオブジェクトそのものを返す場合を示しています。
この動作をまとめるために、or
演算子の変更された(真理)表で説明することができます。
object1 (値) | object2 (値) | object1 oror object2 (戻り値) |
真|真|object1|。 | ||
真|偽|object1|。 | ||
偽の | 真の | object2 |
False | False | object2 |
これは、通常のブール値とオブジェクトをブール式で組み合わせたときにも適用されます。
もし式が True
とみなされる値を少なくとも1つ含んでいれば、式の値は True
ですが、戻り値はその中の最初の True
要素に基づいて変化することができます。
もし、式の中で最初に見つかった True
オペランドが単純なブール値であれば、戻り値は True
となりますが、最初の True
要素が何らかのオブジェクトであれば、戻り値はそのオブジェクト自身となります。
例えば、以下の式は True
を返します。
0 or True
また、次の式は [1, 2, 3]
を返します。
これは、最初に見つかった True
オペランドを表します。
False or [1, 2, 3]
一方、論理式が False
の場合、つまり True
オペランドが見つからなかった場合、その戻り値は最後のオペランドである object か False
のいずれかとなります。
{} or 0.0 or [] or False or ()
# Output >> ()
結論
このガイドでは、Python の or
演算子の使用法を説明しました。
Python の構文を紹介し、 or
演算子がどのようにブール式を評価し、オペランドに基づいて適切な戻り値を決定するかについて説明しました。
論理式の評価という主な用途の他に、 or
演算子は他の使用例でも非常に便利です。
その特徴は、変数のデフォルト値や関数のデフォルトの戻り値などを設定する必要がある場合に適しています。
しかし、それらの特別な使用例はこの記事の範囲をはるかに超えているので、or
演算子が利用できるすべての使用例を探検してもらいたいと思います。