Python | ネストされた if

Python
スポンサーリンク

「ネストを平坦化(浅くする)」リファクタリングは、初心者から中級者へ進むための重要ステップです。
ここでは、

「深い if の入れ子を、どうやって読みやすくするか」
ステップごとに実演 していきます。


ステップ実演:ネストを平坦化する手順

ステップ0:元のコード(深いネスト)

まずは「悪い例」から見てみましょう。

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段ネストで見づらい
  • 「何をチェックしているか」が追いにくい
  • 条件の組み合わせが増えるほど混乱する

ステップ1:条件を逆にして「早期リターン」で脱出

「条件を満たさない」場合に早く抜けるようにします。

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

    print("入場OK(大人・会員・チケットあり)")
Python

どう変わった?

  • ネストがなくなり、直線的に流れる
  • 条件が「ダメな場合→抜ける」というガード節(guard clause) になっている
  • 「通過したらOK」なので分岐の順序が自然

ステップ2:条件を関数化して意味を明確に

複雑な条件を関数に切り出して、「名前で意味が分かる」ようにします。

def is_adult(age):
    return age >= 18

def can_access(age, is_member, has_ticket):
    return is_adult(age) and is_member and has_ticket

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

メリット

  • 関数名が条件の意味を伝える
  • 他の箇所で is_adult(age) を再利用できる
  • if の中身がシンプルに読める

ステップ3:ルールが固定なら辞書化(条件表で整理)

条件が単純な組み合わせなら、**条件表(辞書)**で管理できます。

def check_access(age, is_member, has_ticket):
    rules = {
        (False, None, None): "18歳未満は入場できません",
        (True, False, None): "会員登録が必要です",
        (True, True, False): "チケットが必要です",
        (True, True, True): "入場OK(大人・会員・チケットあり)"
    }

    key = (age >= 18, is_member if age >= 18 else None, has_ticket if is_member else None)
    print(rules.get(key, "条件エラー"))
Python

メリット

  • 条件を増やすときに if を増やさなくていい
  • 「ルール表」として見やすい

ステップ4:再利用を意識した構造に(関数+戻り値)

print文ではなく「結果文字列を返す」関数にしておくと、
GUI・Webアプリ・ログ出力などどこでも使える

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(大人・会員・チケットあり)"

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

メリット

  • print を別の場所に移せる(テストしやすい)
  • 条件ロジックだけ独立して保てる

ステップ5:可読性チェック(平坦化後)

「コードが自然に読めるか?」を確認します。

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(大人・会員・チケットあり)"
Python

これなら、上から順に読むだけでロジックが頭にスッと入る
「深い if」がなくなり、誰が見ても理解しやすいです。


まとめ:ネスト平坦化の手順表

ステップ手順ポイント
0ネストされたコードを確認条件が多層で読みづらい状態
1逆条件で「早期リターン」ダメな場合はすぐ抜ける
2条件式を関数化名前で意味を明確にする
3条件表(辞書)に置き換え複数条件の組み合わせ整理
4戻り値にして再利用性UPprintに依存しない構造
5可読性確認上から下へ自然に読める流れに
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました