Python | ネストされた if

Python
スポンサーリンク

ネストされた if を初心者向けにやさしく解説

いくつかの条件を「順番に」「段階的に」チェックしたいとき、if の中に if を書くことがあります。これが「ネスト(入れ子)された if」です。うまく使えば読みやすくなりますが、深くしすぎると逆に読みにくくなるのでコツが大切です。


ネストされた if の基本

  • 考え方: 外側の条件が「前提」を作り、内側の条件が「前提が成り立つときの詳細」を判断します。
  • 使いどころ: まず安全確認や元データのチェックをしてから、次の細かい判定をしたいとき。
  • 注意点: インデント(字下げ)で階層を表すので、スペースの数をそろえること。
x = int(input("数値を入力: "))

if x >= 0:                # 外側:前提(非負)
    if x % 2 == 0:        # 内側:詳細(偶数)
        print("非負の偶数です")
    else:
        print("非負の奇数です")
else:
    print("負の数です")
Python

例題で身につける

例1: 会員かどうか+購入金額で割引を決める

  • 狙い: 前提(会員かどうか)→詳細(購入額)という段階的な判断。
is_member = input("会員ですか?(y/n): ") == "y"
amount = int(input("購入金額(円): "))

if is_member:                     # 前提:会員
    if amount >= 10000:           # 詳細:高額
        print("15%割引")
    else:
        print("5%割引")
else:                             # 非会員
    if amount >= 10000:
        print("3%割引")
    else:
        print("割引なし")
Python
  • ポイント: 外側で人の種類(会員/非会員)を分け、内側で金額による細分をする。

例2: 入力の妥当性チェック → 詳細な判定

  • 狙い: まず「使っていい値か」を確認してから、中身の判定を進める。
text = input("文字列を入力してください: ")

if text:                          # 空文字でないか(前提)
    if text.isdecimal():          # 数字か(詳細)
        print("数字です")
    elif text.isalpha():          # アルファベットか(詳細)
        print("アルファベットです")
    else:
        print("その他の文字です")
else:
    print("空の入力です")
Python
  • ポイント: 「前提を満たすときだけ」次の条件を評価。エラーや例外を減らせます。

例3: 時間帯+天気でメッセージを変える

  • 狙い: 大分類(時間帯)→小分類(天気)で人間の考え方に近いロジック。
hour = int(input("時刻(0〜23): "))
weather = input("天気(sunny/rainy/cloudy): ")

if 5 <= hour <= 11:                     # 朝
    if weather == "sunny":
        print("おはよう、晴れだね!")
    elif weather == "rainy":
        print("おはよう、傘を忘れずに")
    else:
        print("おはよう、涼しいね")
elif 12 <= hour <= 17:                  # 昼
    if weather == "sunny":
        print("こんにちは、散歩日和")
    elif weather == "rainy":
        print("こんにちは、足元注意")
    else:
        print("こんにちは、のんびりしよう")
else:                                   # 夕〜夜・深夜
    if weather == "sunny":
        print("こんばんは、星がきれい")
    elif weather == "rainy":
        print("こんばんは、暖かくしてね")
    else:
        print("こんばんは、静かな夜だね")
Python
  • ポイント: まず時間で大きく分けてから、天気で細分化。

つまずきポイントと回避策

  • インデントの乱れ:
    • 対策: レベルごとにスペース4つ。混在するとバグの温床になります。
  • ネストが深すぎる:
    • 対策: 条件を整理して浅くする。and/or を使う、早期リターン(関数内)を使う。
  • 重複条件:
    • 対策: 外側条件が「必ず真」の範囲を作るので、内側で同じチェックを繰り返さない。

ネストを浅くするテクニック

テク1: 論理演算子でまとめる

age = int(input("年齢: "))
has_ticket = input("チケットあり?(y/n): ") == "y"

# ネストせずに1行で条件合成
if age >= 18 and has_ticket:
    print("入場できます")
else:
    print("入場できません")
Python
  • 使いどころ: 条件が短く、意味がはっきりしているとき。

テク2: ガード節(早期 return)で分岐を分離

def can_register(email, password):
    if not email or "@" not in email:     # 前提NGならすぐ戻る
        return "メールが不正です"
    if not password or len(password) < 8: # ここでもすぐ戻る
        return "パスワードが短いです"

    # ここまで来たら前提クリア
    return "登録できます"
Python
  • 使いどころ: 関数の中で「前提チェック→本処理」の流れにしたいとき。

テク3: 辞書マッピングで分岐を列挙

day = input("曜日(mon/tue/wed/thu/fri/sat/sun): ")
messages = {
    "mon": "月曜、ゆっくり始めよう",
    "tue": "火曜、コツコツいこう",
    "wed": "水曜、折り返し",
    "thu": "木曜、もう一息",
    "fri": "金曜、あと少し",
    "sat": "土曜、休もう",
    "sun": "日曜、整えよう",
}
print(messages.get(day, "不明な曜日です"))
Python
  • 使いどころ: 明確な対応表がある場合。if の連続を減らせます。

練習問題

  • 問題1: テスト合格判定
    • 前提: 受験資格あり(本人確認済みかつ受験料支払い済み)
    • 詳細: 点数が80以上なら合格、60〜79は追試、60未満は不合格
  • 問題2: 乗り物の利用可否
    • 前提: 身長が120cm以上
    • 詳細: 140cm以上なら「絶叫コース可」、120〜139なら「通常コースのみ」
  • 問題3: ファイルアップロード
    • 前提: 拡張子が jpg/png
    • 詳細: サイズが5MB以下なら「アップロード成功」、それ以上なら「サイズオーバー」

ヒント(問題2の書き方例):

height = int(input("身長(cm): "))

if height >= 120:                 # 前提を先に
    if height >= 140:             # 詳細その1
        print("絶叫コース可")
    else:                         # 詳細その2
        print("通常コースのみ")
else:
    print("利用不可(120cm未満)")
Python

まとめ

  • ネストされた if は「前提→詳細」という段階的な思考をコードにする方法。
  • 深すぎるネストは読みにくいので、論理演算子・ガード節・辞書化で浅くする工夫が有効。
  • インデントと条件の重複に注意し、「まず何を確かめたいか」を外側に置くと読みやすくなる。
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました