5-4. Pythonのブール演算子 and, or, not


1. ブール演算子とは?

真偽値 (True, False)に対して演算ができるものです。
PythonではBool型のTrue, Falseに対して使います。

A が True かつ B が True の場合、True となるものを論理積と言います。
以下のイメージ図では斜線部分が論理積で True となる部分です。

論理積のイメージ図


A が True または B が True の場合、True となるものを論理和と言います。
以下のイメージ図では水色の部分が論理和で True になる部分です。

論理和のイメージ図


A が False の場合に True になるものを否定と言います。
以下のイメージ図では赤色の部分が否定でTrueになる部分です。

否定のイメージ図


2. Pythonのブール演算子 一覧

Pythonのブール演算子は以下の通りです。

 演算子説明使用例
and論理積(かつ) x == 10 and y == 10
or論理和(または)x <= 10 or y <=10
not否定(でない)not x > 10


and は両方がTrueの場合のみTrueです。

print(True and True)
>> True

print(True and False)
>> False

print(False and True)
>> False

print(False and False)
>> False


or は片方がTrueであればTrueです。

print(True or True)
>> True

print(True or False)
>> True

print(False or True)
>> True

print(False or False)
>> False


notTrueFalseが逆転します。

print(not True)
>> False

print(not False)
>> True


3. ブール演算子を使ったif文

Pythonのif文の条件文では、以下のようにブール演算子を使用します。

x = 10
y = 20

if x >= 10 and y >= 10:
    print('xが10以上、かつ、yが10以上')
else:
    print('xが10未満、または、yが10未満')

>> 'xが10以上、かつ、yが10以上'

4. 複数の論理演算子を使う

論理演算子を複数使うことも可能です。
論理演算子の優先順位は not < () <and < or です。

例: A and B or not C

  1. CのTrue/Falseを逆転したものをC’とする
  2. A and B の結果をA’とする
  3. A’ or C’ の結果を最終的な結果とする

例: A and (B or not C)

  1. CのTrue/Falseを逆転したものをC’とする
  2. B or C’ の結果をB’とする
  3. A and B’ の結果を最終的な結果とする
A = False
B = True
C = False

print(A and B or not C)
>> True
print(A and (B or not C))
>> False


5. ド・モルガンの法則でコードを分かりやすくする

notと()を使用した論理演算は分かりにくいです。


例えばコードAとコードBでは、条件文の内容・処理結果は同じですが、一般的にはBの方が直感的で分かりやすいです。

"""
コードA
"""
if not (x == 10 and y == 10):
    print('斜線の部分')


"""
コードB
"""
if not x == 10 or not y == 10:
    print('斜線の部分')


条件文を分かり易く書き方を変えるテクニックの1つにド・モルガンの法則を方法があります。
左の書き方を右に変更しても、論理演算の結果は同じです。

  • not (A and B)not A or not B
  • not(A or B)not A and not B

そのため、右のような書き方をした方が、一般的には良いでしょう。
しかし、左のような書き方のほうが、ビジネスロジックとして分かりやすい場合は左の書き方をしても問題ありません。


6. if…elseの条件文では否定を避ける

if…elseの条件文は否定を避けて記載することができます。

例えば、以下のコードA、コードBは処理結果は同じですが、コードAの方が一般的には分かりやすいです。

x = True

"""
コードA
"""
if x:
    print('Xが真の場合の処理A')
else:
    print('Xが偽の場合の処理B')


"""
コードB
"""
if not x:
    print('Xが偽の場合の処理B')
else:
    print('Xが真の場合の処理A')


if文の最初の条件文は正常系からの方が良いとされています。しかし、否定条件の場合も否定条件じゃない場合も正常系であれば、notがない条件文をif文の条件にした方が分かりやすいです。


7. Python 公式ドキュメント