Pythonのブール演算子:and, or, not の使い方と短絡評価

Pythonで if 文などの条件分岐を扱う際、複数の条件を組み合わせたい場合があります。例えば、「ユーザーが認証済み かつ 管理者である」や「処理が失敗した または タイムアウトした」といった複雑な判定です。

これを実現するのが、TrueFalse のブール値に対して使われる**ブール演算子(論理演算子)**の and, or, not です。

この記事では、これら3つの演算子の使い方と、Python特有の「短絡評価」という重要な動作について解説します。

目次

not 演算子 (論理否定)

not は、ブール値の TrueFalse を反転させます。

  • not TrueFalse になります。
  • not FalseTrue になります。

「~ではない」という条件を指定する際に使用します。

is_active_user = False

# is_active_user が False の場合に True となる
if not is_active_user:
    print("ユーザーはアクティブではありません。")

# ---
is_connected = True

# is_connected が True なので、not を付けると False となる
if not is_connected:
    print("接続されていません。") # この行は実行されない

実行結果:

ユーザーはアクティブではありません。

and 演算子 (論理積)

and は、両方の条件が True の場合のみ、全体を True と評価します。一つでも False があれば、全体は False になります。

「A かつ B」という条件に相当します。

ABA and B
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse
# 権限チェックの例
is_authenticated = True # 認証済み
is_admin = False      # 管理者ではない

# 認証済み 'かつ' 管理者である必要がある
if is_authenticated and is_admin:
    print("管理者メニューへのアクセスを許可します。")
else:
    print("アクセス権限がありません。('and' 条件が False)")

実行結果:

アクセス権限がありません。('and' 条件が False)

or 演算子 (論理和)

or は、どちらか一方の条件が True であれば、全体を True と評価します。両方が False の場合のみ、全体が False になります。

「A または B」という条件に相当します。

ABA or B
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse
# エラーチェックの例
has_network_error = False
has_timeout = True

# ネットワークエラー 'または' タイムアウトが発生した場合
if has_network_error or has_timeout:
    print("処理が失敗しました。('or' 条件が True)")
else:
    print("処理は正常に完了しました。")

実行結果:

処理が失敗しました。('or' 条件が True)

重要な概念:短絡評価 (Short-circuit Evaluation)

andor 演算子には、「短絡評価」と呼ばれる非常に重要な動作があります。これは、結果が確定した時点で、それ以降の式の評価を行わない(ショートサーキットする)仕組みです。

1. and の短絡評価

A and B の評価において、もし A が False であった場合、B が True でも False でも、and 全体の結果は必ず False になります。

そのため、Pythonは A が False だった時点で B を評価しません。

2. or の短絡評価

A or B の評価において、もし A が True であった場合、B が True でも False でも、or 全体の結果は必ず True になります。

そのため、Pythonは A が True だった時点で B を評価しません。

短絡評価のメリット

この仕組みは、プログラムの効率化だけでなく、エラーの回避にも役立ちます。

例:エラー回避

None かもしれないオブジェクトのメソッドを呼び出す前に、None でないことを確認する際によく使われます。

user_object = None # ユーザーオブジェクトがまだ存在しないとする

# もし短絡評価がなければ、'user_object.is_active()' を評価しようとして
# 'NoneType' object has no attribute 'is_active' というエラーが発生する
#
# 'and' の短絡評価のおかげで、
# 1. 'user_object is not None' が False と評価される
# 2. 右側の 'user_object.is_active()' は評価されずに済む
# 3. if文全体が False となり、エラーを回避できる
if user_object is not None and user_object.is_active():
    print(f"{user_object.name} はアクティブです。")
else:
    print("ユーザーが存在しないか、アクティブではありません。")

実行結果:

ユーザーが存在しないか、アクティブではありません。

まとめ

  • not はブール値を反転させます(「~ではない」)。
  • and は両方が True の場合のみ True になります(「A かつ B」)。
  • or はどちらかが True であれば True になります(「A または B」)。
  • andor は「短絡評価」を行います。and は左側が False なら右側を評価せず、or は左側が True なら右側を評価しません。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次