Python | 論理演算子(ブール演算子)

Python
スポンサーリンク

はじめに

はじめての条件分岐って、ちょっとした日本語の読み取りゲームに似ています。「〜かつ〜」「〜または〜」「〜ではない」を正しく組み合わせられると、プログラムはグッと思い通りに動きます。肩の力を抜いて、動く例を触りながら感覚で覚えていきましょう。


ブール値と基本の3兄弟(and / or / not)

Pythonの条件は「True(真)」か「False(偽)」の2択です。論理演算子はその真偽を組み合わせる道具です。

  • ブール値:
    True と False の2つ。比較演算(>, ==, <= など)の結果は必ずこのどちらかになります。
  • and(かつ):
    両方が True のときだけ True。どちらかが False なら False。
  • or(または):
    どちらかが True なら True。両方 False のときだけ False。
  • not(否定):
    True を False に、False を True にひっくり返します。
a = 7
b = 0

print(a > 5 and b == 0)  # True(a>5 は True、b==0 も True、両方Trueだから True)
print(a < 5 or b == 0)   # True(a<5 は False、b==0 は True、どちらかTrueなら True)
print(not (a == 7))      # False(a==7 は True、その否定は False)
Python

よくある場面別の書き方

数値の範囲チェック

  • 両端を含む範囲:
    例えば「0〜100点なら有効」。
score = 85
if 0 <= score and score <= 100:
    print("有効な点数です")
Python
  • Pythonらしい書き方:
    連鎖比較が使えると読みやすくなります。
if 0 <= score <= 100:
    print("有効な点数です")
Python

複数条件の合格判定

  • 両方合格(and):
    2科目とも80点以上なら合格。
math = 82
english = 80
if math >= 80 and english >= 80:
    print("合格!")
Python
  • 片方でも合格(or):
    どちらかが90点以上なら特別合格。
if math >= 90 or english >= 90:
    print("特別合格!")
Python

入力のチェック(否定を使う)

  • 空文字禁止(not):
    入力が空でないことを確認。
name = ""
if not name:
    print("名前を入力してください")  # 空文字や None は「偽」とみなされる
Python

ショートサーキット(途中で判断を打ち切る性質)

論理演算子は「結論が決まったら、残りを見ない」最適化をします。これを知っておくと安全で効率的なコードが書けます。

  • and の打ち切り:
    左が False なら、右を見なくても結果は False。
user = None
# user が None のとき、右の user["name"] は評価されないのでエラーにならない
if user is not None and user.get("name") == "Alice":
    print("ようこそ")
Python
  • or の打ち切り:
    左が True なら、右を見なくても結果は True。
is_admin = True
is_owner = False
if is_admin or is_owner:
    print("権限あり")  # 左が True なので右は評価されない
Python
  • 使いどころ:
    エラーになりそうな処理を「安全な前提条件」とセットで並べると、事故を防げます。

初心者がハマりがちな落とし穴

  • 比較と代入の混同:
    = は代入、== は比較。条件では必ず == を使う。
x = 3
# if x = 3:  # これはエラー! 比較は == を使う
if x == 3:
    print("3です")
Python
  • or の乱用で条件が緩すぎる:
    「どちらかOK」なのか「両方必要」なのかを整理してから書く。
age = 17
has_parent = True
# 18歳以上 or 保護者同伴ならOK
if age >= 18 or has_parent:
    print("入場OK")
Python
  • not のかけすぎで読みづらい:
    二重否定は避け、肯定形に言い換えると読みやすい。
# 悪い例:
if not (status != "ready"):
    pass
# 良い例:
if status == "ready":
    pass
Python

小さな例題で体感しよう

例題1:3の倍数かつ5の倍数

  • 条件:
    入力が3の倍数「かつ」5の倍数なら「FizzBuzz」、それ以外はそのまま表示。
n = 15
if n % 3 == 0 and n % 5 == 0:
    print("FizzBuzz")
else:
    print(n)
Python

例題2:ログイン判定

  • 条件:
    ユーザー名が空でない「かつ」パスワードが8文字以上ならOK。
username = "mika"
password = "pass1234"

if username and len(password) >= 8:
    print("ログイン成功")
else:
    print("ユーザー名またはパスワードが不正です")
Python

例題3:営業時間チェック

  • 条件:
    10〜19時は営業。「ただし、祝日は休業」。曜日と祝日フラグを使う。
hour = 18
is_holiday = False

if 10 <= hour <= 19 and not is_holiday:
    print("営業中")
else:
    print("休業")
Python

例題4:安全にアクセス(ショートサーキット)

  • 条件:
    user が存在し、さらに active が True のときだけ歓迎メッセージ。
user = {"name": "Ryo", "active": True}

if user and user.get("active"):
    print(f"ようこそ、{user['name']}さん")
else:
    print("アクセス不可")
Python

練習問題(自分で書いて動かす)

  • 問題1:
    整数 n が「偶数」または「7の倍数」なら「OK」、それ以外は「NG」と表示する。
  • 問題2:
    文字列 msg が「空でない」かつ「先頭が ‘!’ ではない」なら、そのまま表示。そうでなければ「無効なメッセージ」と表示。
  • 問題3:
    年齢 age と会員フラグ is_member に対し、「20歳以上 かつ 会員」または「65歳以上」の場合に「割引適用」と表示。それ以外は「通常料金」。
# 例の解答コード(自分の値に変えて試してみてください)

# 問題1
n = 14
if n % 2 == 0 or n % 7 == 0:
    print("OK")
else:
    print("NG")

# 問題2
msg = "Hello"
if msg and not msg.startswith("!"):
    print(msg)
else:
    print("無効なメッセージ")

# 問題3
age = 64
is_member = True
if (age >= 20 and is_member) or age >= 65:
    print("割引適用")
else:
    print("通常料金")
Python

うまくなるコツ

  • 自然言語に言い換える:
    まず日本語で「〜なら」「かつ」「または」を短く書き、それをコードに移す。
  • 条件を分解する:
    長い if 条件は変数に切り出すと読みやすい。
age_ok = age >= 20
member_ok = is_member
discount_ok = (age_ok and member_ok) or age >= 65

if discount_ok:
    print("割引適用")
Python
  • テストして確かめる:
    True/False がどう変わるか、値を入れ替えて結果を見る。間違いに気づく速度が上がります。
タイトルとURLをコピーしました