Pythonの論理演算子and, or, not(論理積、論理和、否定)

Pythonには、論理演算(ブール演算)を行う論理演算子and, or, notが用意されています。if文で複数の条件の関係を記述する際などに使います。 ここでは、

論理積(かつ): and 論理和(または): or 否定(でない): not

および、注意点として、

bool型以外のオブジェクトに対する論理演算子 and, orの返り値はbool型とは限らない ショートサーキット(短絡評価)

について説明します。 True, Falseの論理演算(ブール演算)ではなく、2進数で表した整数の各ビットに対する論理演算(ビット演算)については、

論理積(かつ): and

andは二つの値の論理積(かつ)を返します。

x = True
y = False

print(x and y)
# False

論理和(または): or

orは二つの値の論理和(または)を返します。

print(x or y)
# True

否定(でない): not

notは値の否定(でない)を返します。True, Falseが反転します。

print(not x)
# False

bool型以外のオブジェクトに対する論理演算子

論理演算子and, or, notでは、bool型(True, False)だけでなく、数値や文字列、リストなども真偽値として処理されます。 Pythonの論理演算において、偽Falseとみなされるのは以下のオブジェクト。

bool型のFalse None 数値(int型やfloat型)の0, 0.0 空の文字列'' 空のコンテナ(リスト、タプル、辞書など)[], (), {},

これ以外はすべて真Trueとみなされます。 関数bool()を使うとオブジェクトの真偽値を取得できます。文字列'0'や'False'は真とみなされるので気をつけてください。

print(bool(10))
# True

print(bool(0))
# False

print(bool(''))
# False

print(bool('0'))
# True

print(bool('False'))
# True

print(bool([]))
# False

print(bool([False]))
# True

文字列'0'や'False'を処理するにはdistutils.util.strtobool()を使います。

and, orの返り値はbool型とは限らない

ここで、bool型以外のオブジェクトの例として数値に対するand, or, notの演算結果を示す。

x = 10  # True
y = 0  # False

print(x and y)
# 0

print(x or y)
# 10

print(not x)
# False

上の例から分かるように、Pythonのand, orは、bool型のTrue, Falseを返すのではなく、真偽に応じて左辺または右辺のオブジェクトをそのまま返す(notはbool型のTrue, Falseを返す)。例は数値だが文字列やリストなど他の型でも同じです。 andとorの返り値の定義は以下の通り。

式 x and y は、まず x を評価します; x が偽なら x の値を返します; それ以外の場合には、 y の値を評価し、その結果を返します。 式 x or y は、まず x を評価します; x が真なら x の値を返します; それ以外の場合には、 y の値を評価し、その結果を返します。 6. 式 (expression) — Python 3.6.3 ドキュメント

左辺値・右辺値がTrueとFalseの場合は返り値が分かりやすいが、どちらもTrue、またはどちらもFalseのときは順番によって返り値が異なります。 if文で条件式として使う場合は結果が真偽値として処理されるので特に気にする必要はないが、返り値を使ってさらに処理を行う場合は注意が必要。

x = 10  # True
y = 100  # True

print(x and y)
# 100

print(y and x)
# 10

print(x or y)
# 10

print(y or x)
# 100

x = 0  # False
y = 0.0  # False

print(x and y)
# 0

print(y and x)
# 0.0

print(x or y)
# 0.0

print(y or x)
# 0

andとorの左辺値x・右辺値yと返り値の関係を表にまとめると以下のようになります。x

y
x and y
x or y

真 偽 y x 偽 真 x y 真 真 y x 偽 偽 x y

ショートサーキット(短絡評価)

上の表から分かるように、x and yでxが偽Falseの場合やx or yでxが真Trueの場合は、yの値によらず返り値がxとなります。 このような場合、yは評価されません。 and, orの右辺で関数やメソッドを呼び出して何らかの処理を行う場合は、左辺の結果によって処置が実行されないことがあるので注意が必要。

def test():
    print('function is called')
    return True

print(True and test())
# function is called
# True

print(False and test())
# False

print(True or test())
# True

print(False or test())
# function is called
# True
Last Updated: 6/26/2019, 10:34:03 PM