Pythonで if 文などの条件分岐を扱う際、複数の条件を組み合わせたい場合があります。例えば、「ユーザーが認証済み かつ 管理者である」や「処理が失敗した または タイムアウトした」といった複雑な判定です。
これを実現するのが、True と False のブール値に対して使われる**ブール演算子(論理演算子)**の and, or, not です。
この記事では、これら3つの演算子の使い方と、Python特有の「短絡評価」という重要な動作について解説します。
not 演算子 (論理否定)
not は、ブール値の True と False を反転させます。
not TrueはFalseになります。not FalseはTrueになります。
「~ではない」という条件を指定する際に使用します。
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」という条件に相当します。
| A | B | A and B |
True | True | True |
True | False | False |
False | True | False |
False | False | False |
# 権限チェックの例
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」という条件に相当します。
| A | B | A or B |
True | True | True |
True | False | True |
False | True | True |
False | False | False |
# エラーチェックの例
has_network_error = False
has_timeout = True
# ネットワークエラー 'または' タイムアウトが発生した場合
if has_network_error or has_timeout:
print("処理が失敗しました。('or' 条件が True)")
else:
print("処理は正常に完了しました。")
実行結果:
処理が失敗しました。('or' 条件が True)
重要な概念:短絡評価 (Short-circuit Evaluation)
and と or 演算子には、「短絡評価」と呼ばれる非常に重要な動作があります。これは、結果が確定した時点で、それ以降の式の評価を行わない(ショートサーキットする)仕組みです。
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」)。andとorは「短絡評価」を行います。andは左側がFalseなら右側を評価せず、orは左側がTrueなら右側を評価しません。
