論理演算

論理演算とはTrueとFalseの間の演算で、結果がTrueまたはFalseになるものです。 Pythonでもandやorの演算を行えますが、結果がTrueまたはFalseではない場合があります。

論理型(ブール型):True、False

真偽値

真偽値は、真または偽と判断されるもので、以下のように決まります。

  • 真: True 、非ゼロの数値、空でない文字列、空でないタプル、空でないリスト、空でない辞書、Noneでないオブジェクト
  • 偽: False 、ゼロ、空文字列、空のタプル、空のリスト、空の辞書、None

論理積(A and B)

A B 結果
True True True
True False False
False True False
False False False

論理和(A or B)

A B 結果
True True True
True False True
False True True
False False False

排他的論理和(A xor B)

A B 結果
True True”,”False  
True False True
False True True
False False False

※ Pythonでは、排他的論理和の論理演算子(xor)はありません。ビット単位の排他的論理和は、「^」でできます。

Python(A and B)

Pythonでは、and演算子、or演算子でオブジェクトを比較すると戻りとしてオブジェクトが返ります。 and演算子では、AがFalse扱いのオブジェクトだった場合はBは実行されずAの値が返ります。

A B 結果
True True B
True False B
False True A
False False A

以下の例では、変数c, 変数dはFalse扱いになります。

>>> a = 1
>>> b = "Hello"
>>> c = 0
>>> d = ''
>>> a and b
'Hello'
>>> a and c
0
>>> c and a
0
>>> c and d
0

Python(A or B)

or演算子では、AがTrue扱いのオブジェクトだった場合はBは実行されずAの値が返ります。

A B 結果
True True A
True False A
False True B
False False B
>>> a = 1
>>> b = "Hello"
>>> c = 0
>>> d = ''
>>> a or b
1
>>> a or c
1
>>> c or b
'Hello'
>>> c or d
''

短絡評価の有無

変数に代入せずに直接関数を利用すると短絡評価(左辺の式で評価が決まってしまうと右辺の式が実行されない)の副作用がでます。

import random
random.seed(0)
cond = False and random.random()  # 短絡評価あり
print(random.random())
# 0.8444218515250481

def _and(a, b):
    return a and b
random.seed(0)
cond = _and(False, random.random()) # 短絡評価なし
print(random.random())
# 0.7579544029403025