Python | ネストされた if

Python
スポンサーリンク

ネストされた if(入れ子の if)は、ある条件の中でさらに別の条件をチェックしたいときに使います。イメージは「まず入口のドアを通る → 中の部屋で別の扉を調べる」といった感じ。順序・インデント(字下げ)が大切です。


1行でまとめると

「ある条件を満たしたときだけ、さらに細かい条件を調べる」ための構造です。


基本構文(超シンプル)

if 条件A:
    # 条件Aが True のときだけここに入る
    if 条件B:
        # 条件Aかつ条件B のとき
    else:
        # 条件Aは True だけど条件B は False のとき
else:
    # 条件A が False のとき
Python

ポイント:内側の if外側の if が True のときにしか評価されない


例1:年齢と会員判定(基本)

age = int(input("年齢を入力: "))
is_member = input("会員ですか? (y/n): ") == "y"

if age >= 18:
    # 大人のみ会員判定
    if is_member:
        print("成人会員です")
    else:
        print("成人・非会員です")
else:
    print("未成年です(会員判定は不要)")
Python

逐次実行(入力例:age=20, is_member=y)

  1. age >= 18 を評価 → True → 内側へ
  2. if is_member を評価 → True → 「成人会員です」出力 → 終了
    age < 18 なら内側はそもそも評価されない)

例2:成績+出席で合格判定(現実的な使用例)

score = int(input("点数: "))
attendance = float(input("出席率(%) : "))

if score >= 60:
    # 点数合格ラインを満たしている場合だけ出席率も確認
    if attendance >= 75:
        print("合格")
    else:
        print("不合格(出席不足)")
else:
    print("不合格(点数不足)")
Python

この場面でネストが有効なのは、「点数が十分でないなら出席率は調べなくてよい」というビジネスルールがあるから。


例3:多段ネスト(深くなりすぎる例)

if A:
    if B:
        if C:
            print("A B C がすべて真")
        else:
            print("A と B は真だが C は偽")
    else:
        print("A は真だが B は偽")
else:
    print("A は偽")
Python

注意:深いネスト(3〜4層以上)は読みづらく、バグを呼びやすいです。後述の「ネストを浅くするテクニック」を使いましょう。


ネストするときの よくあるミス

  • インデント(スペース)の数を揃えず IndentationError にする。Python はインデントが構文の一部。
  • 内側の条件を外側の条件と独立にチェックしたいのに、誤ってネストしてしまい期待した結果にならない(=排他/独立の混同)。
  • 深くネストしすぎてロジックが追えなくなる。

ネストを浅くする(可読性向上テクニック)

  1. 早期リターン(ガード節) — 関数内で使うと有効:
def check_user(age, is_member):
    if age < 18:
        return "未成年です"
    # ここから age >= 18 が保証される
    if is_member:
        return "成人会員です"
    return "成人・非会員です"
Python
  1. 論理演算子でまとめる(複雑になりすぎない程度で):
if age >= 18 and is_member:
    print("成人会員です")
elif age >= 18 and not is_member:
    print("成人・非会員です")
else:
    print("未成年です")
Python
  1. 関数に分ける — 役割ごとに切ると読みやすい:
def is_adult(age): return age >= 18
def membership_text(is_member): return "会員" if is_member else "非会員"

if is_adult(age):
    print("成人:" + membership_text(is_member))
else:
    print("未成年")
Python
  1. 辞書でルール化(特定の値の組み合わせに対応する場合):
actions = {
    (True, True): "成人会員",
    (True, False): "成人非会員",
    (False, None): "未成年"
}
key = (age >= 18, is_member if age >= 18 else None)
print(actions.get(key, "不明"))
Python

練習問題(自分で書いて試してみよう)

  1. 入力された数が正か負かを判定し、正ならさらに偶数/奇数を判定して表示するプログラムを書け。
  2. ログイン処理:ユーザー名とパスワードを入力。ユーザー名が存在するかを先に調べ、存在するならパスワードをチェックして「ログイン成功/失敗」を出す(存在しなければ「ユーザー無し」)。
  3. 例題を関数にして、早期リターンでネストを浅く書き直してみる(上のログイン処理など)。

練習問題の解答(模範)

n = int(input("整数: "))
if n > 0:
    if n % 2 == 0:
        print("正の偶数")
    else:
        print("正の奇数")
elif n == 0:
    print("ゼロ")
else:
    print("負の数")
Python
users = {"alice":"pass123", "bob":"qwerty"}  # ユーザー名:パスワード

username = input("ユーザー名: ")
password = input("パスワード: ")

if username in users:
    if users[username] == password:
        print("ログイン成功")
    else:
        print("パスワードが違います")
else:
    print("ユーザーが存在しません")
Python

3.(早期リターンで書き直す)

def login(username, password, users):
    if username not in users:
        return "ユーザーが存在しません"
    if users[username] != password:
        return "パスワードが違います"
    return "ログイン成功"

print(login(input("ユーザー名: "), input("パスワード: "), users))
Python

まとめ(初心者がまず覚えること)

  • ネストは「条件の中でさらに条件をチェック」するときに便利。
  • インデントを正しく!(Pythonでは必須)
  • 深くなりすぎたら return、関数分割、論理演算子、辞書等で浅く書き換えると可読性が上がる。
  • ネストを使う前に「本当にネストが必要か?」を一度考える習慣をつけよう。
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました