ネストされた 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 は「前提→詳細」という段階的な思考をコードにする方法。
- 深すぎるネストは読みにくいので、論理演算子・ガード節・辞書化で浅くする工夫が有効。
- インデントと条件の重複に注意し、「まず何を確かめたいか」を外側に置くと読みやすくなる。
