Pythonにはor
やand
やnot
という演算子が存在していますが、これらはブール演算子と呼ばれます。
Pythonにおける真理値
Pythonはどのようなオブジェクトも真理値(真偽値)として表すことができ、組み込み関数の中では以下のようなものが偽と判定されます。
- 偽であると定義されている定数: None と False
- 数値型におけるゼロ: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
- 空のシーケンスまたはコレクション: '', (), [], {}, set(), range(0)
また、オブジェクトのクラスが__bool__()
メソッドを定義しており、それがFalse
を返す場合か、__len__()
メソッドを定義していて0を返す場合には偽と判定されます。
判定の際には組み込み関数bool()
を利用します。
>>> bool(None)
False
>>> bool(False)
False
>>> bool(0)
False
>>> bool("")
False
>>> bool([])
False
# 偽ではないものは全て真となる
>>> bool("0")
True
>>> bool([False])
True
orの使い方
AまたはBのどちらか一方が真
かどうか判定したいときなどに利用されます。
if文などの制御構文の外でももちろん利用できます。
>>> x = True
>>> y = False
>>> x or y
True
>>> bool(x or y)
True
ちなみにor
と後述するand
はブール値を返さず、比較したオブジェクトを左から値を評価していき、戻り値が確定したタイミングでそのまま返します。
上記の例(x or y)では
- xが真であるならyを評価せずxを返す(yが真でもxを返す)
- そうではないならyを返す
という動作をします
>>> a = 0 # 真理値がTrueとなる値を定義
>>> b = 1 # 真理値がFalseとなる値を定義
>>> a or b # bがTrueなのでbが返る
1
>>> b or a # 逆にしてもbがTrueなのでbが返る
1
>>> b = "" # 真理値がFalseとなるaとは別の値を再代入
a or b # aがFalseなのでbが返る
""
ちなみにor
は2つ以上連結しても同様の動作をして、左から評価されていきます。
>>> a = 0
>>> b = 1
>>> c = 2
>>> a or b or c
1
真理値を返す演算子だと勘違いされがちですが、忘れないようにしましょう。
andの使い方
and
はAとBのどちらも真
かどうかを判定したいときなどに利用できます。
and
についても戻り値は評価対象のオブジェクトのため、ブール値が返るわけではありません。
>>> x = 0
>>> y = 1
>>> x and y
0
or
と同様に結果が確定した段階でオブジェクトを返します。
- xが偽ならxを返す
- それ以外ならyを返す
という動作をします。
偽となるオブジェクトが発見次第結果を返却してしまうため、厳密には比較対象全てが真であることをチェックしていないことに注意してください。
and
についても2つ以上の連結が可能です。
>>> a = 0
>>> b = 1
>>> c = 2
>>> a and b and c # aが偽なのでaを返す
0
>>> d = 10
>>> d and b and c # dが真、bが真でcを確認した際に結果が確定するのでcが返る
2
notの使い方
not
は否定を表す演算子であり、not False
などのように後ろに一つだけ値を取り、その値を否定します。
上記説明の二つの演算子と違い、返却するのはブール値になります。
>>> x = 0
>>> y = 1
>>> not x # xはFalseとなる値であるが、notをつけるとTrueになる
True
>>> not y # yはTrueとなる値であるが、notをつけるとFalseになる
False
not
はor
やand
よりも優先度が高く、先に評価されます。
>>> a = 0
>>> b = 1
>>> c = 2
>>> not a and b and c # 偽であるaが否定され真になり、全て真であるため最後に評価されたオブジェクトcが返る
c
>>> d = 10
>>> d and not b and c # 全て真であったが、bが否定されFalseとなるためbが返る
False
基本ではありますが、戻り値について忘れがちなため、意識して利用するようにしていきたいです。