Python | ネストされた if

Python
スポンサーリンク

では、「ネストされたコード」→「平坦化後のコード」
横並びで比較しながら、
どの行がどう変わったかをコメント付きで丁寧に見ていきましょう。

題材はさきほどの「入場判定(年齢・会員・チケット)」です。


比較テーマ:ネストの平坦化

Before:深いネスト版(読みづらい例)

def check_access(age, is_member, has_ticket):
    # 年齢チェック
    if age >= 18:
        # 会員チェック
        if is_member:
            # チケットチェック
            if has_ticket:
                print("入場OK(大人・会員・チケットあり)")
            else:
                print("チケットが必要です")
        else:
            print("会員登録が必要です")
    else:
        print("18歳未満は入場できません")
Python

問題点(解説付き)

問題説明
ネストが3段条件を追うのが大変(視線が右へ右へ…)
ifelse が入り乱れて読みにくいどの else がどの if に対応するか分かりづらい
条件が多いと拡張が大変新しい条件を追加すると「また1段右にインデント」になる
結果の出力が多方向に分岐どこで終わるかパッと見て分からない

After:平坦化(早期リターンで整理)

def check_access(age, is_member, has_ticket):
    # ① 条件を「ダメな場合」から順に処理する
    if age < 18:
        print("18歳未満は入場できません")
        return  # ←ここで関数終了
    
    if not is_member:
        print("会員登録が必要です")
        return
    
    if not has_ticket:
        print("チケットが必要です")
        return
    
    # ② すべて通過したらOK
    print("入場OK(大人・会員・チケットあり)")
Python

改善点

改善説明
ネストがゼロ見た目がまっすぐ。読みやすい
早期リターンで脱出条件を満たさないときにすぐ終了
条件の流れが自然「通過したら次」→ 人間の思考順と一致
拡張が楽新しいチェックを「上に1つ追加」するだけ

並べて比較(対応解説付き)

ネスト版平坦化版解説
1if age >= 18:if age < 18:条件を逆にして「ダメなら抜ける」へ
2(インデント増)returnreturnを入れて早く終わる
3if is_member:if not is_member:同様に逆条件で早期脱出
4if has_ticket:if not has_ticket:3段ネスト→直列3条件へ
5print("OK")(最深部)print("OK")(最後に残す)最後に一度だけ出力、シンプル!

さらに応用(戻り値にして再利用可能に)

def check_access(age, is_member, has_ticket):
    if age < 18:
        return "18歳未満は入場できません"
    if not is_member:
        return "会員登録が必要です"
    if not has_ticket:
        return "チケットが必要です"
    return "入場OK(大人・会員・チケットあり)"

# 呼び出し側
message = check_access(20, True, False)
print(message)
Python

メリット

  • printを外に出せる → GUI・Web・ログでも再利用可
  • テストしやすいassert check_access(20, True, True) == "入場OK..."

まとめ:平坦化の考え方

段階行動結果
条件を「否定形」にする (if not ...)ダメな場合に早期終了できる
returnbreak で脱出深いネストを解消
条件を関数化するロジックを再利用しやすく
結果を返すようにする汎用性アップ(printに依存しない)

体験ミニ課題

下のコードを「ネストが深い→平坦化」に直してみましょう👇

def check_user(age, password):
    if age >= 18:
        if password == "python123":
            print("ログイン成功")
        else:
            print("パスワードが違います")
    else:
        print("18歳未満はログインできません")
Python

Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました