では、先ほどの ネスト平坦化 練習問題セット(10問) の
それぞれに「✅解答例」と「🔍ステップごとの解説」を付けて丁寧に説明していきます。
🧩 ネスト平坦化 練習問題セット:解答&解説
Q1:単純な2段ネスト
元のコード:
if x > 0:
if x < 10:
print("1桁の正の数です")
Python✅ 解答例(平坦化後):
if 0 < x < 10:
print("1桁の正の数です")
Python🔍 ステップ解説:
if x > 0:の中にもう一つif x < 10:がある。
→ 「x が 0 より大きく、かつ 10 未満」のときだけ実行される。- つまり両方が「同時に真」である必要がある。
→andで条件をまとめられる。 0 < x < 10のように範囲条件で1行に書ける。
Q2:else の中に if がある
元のコード:
if score >= 80:
print("合格!")
else:
if score >= 50:
print("あと少し!")
Python✅ 解答例:
if score >= 80:
print("合格!")
elif score >= 50:
print("あと少し!")
Python🔍 ステップ解説:
elseの中にifが入っている → ネストが深くなる。- 「最初の条件がダメだったら次の条件をチェックする」
という構造はelifが最適。 elifはelse + ifの省略形なので、すっきり書ける。
Q3:3段ネスト
元のコード:
if age >= 0:
if age < 13:
if gender == "男":
print("少年です")
Python✅ 解答例:
if 0 <= age < 13 and gender == "男":
print("少年です")
Python🔍 ステップ解説:
- 3つの条件すべて満たすときだけ
print。 - すべて「and」でつながる関係。
→if 条件1 and 条件2 and 条件3:にまとめられる。 0 <= age < 13はPythonならではの連鎖比較で簡潔に。
Q4:複数分岐 + ネスト
元のコード:
if temp > 0:
if temp < 25:
print("過ごしやすい気温です")
else:
print("少し暑いですね")
else:
print("寒いです")
Python✅ 解答例:
if temp <= 0:
print("寒いです")
elif temp < 25:
print("過ごしやすい気温です")
else:
print("少し暑いですね")
Python🔍 ステップ解説:
if temp > 0:の中にさらにif temp < 25:
→ 条件の組み合わせがややこしい。- ネストを抜いて、値の範囲ごとに分岐すればOK。
- 条件の順に意味がつながる:
- 0℃以下 → 寒い
- 25℃未満 → 過ごしやすい
- それ以外 → 暑い
Q5:入力チェック
元のコード:
if user_input.isdigit():
if int(user_input) > 0:
print("正の数です")
Python✅ 解答例:
if user_input.isdigit() and int(user_input) > 0:
print("正の数です")
Python🔍 ステップ解説:
- 外側の
ifで「数字かどうか」を確認。 - 内側の
ifで「数値に変換して正の数か」を確認。 - どちらも満たす必要がある →
andでつなげる。 - 注意:
int()は数字でないとエラーになるので、isdigit()のチェックを先に置く。
Q6:ネスト+早期returnで平坦化
元のコード:
if data is not None:
if len(data) > 0:
print("データがあります")
Python✅ 解答例1(条件をまとめる):
if data is not None and len(data) > 0:
print("データがあります")
Python✅ 解答例2(早期returnを使う関数内):
def check(data):
if data is None or len(data) == 0:
return
print("データがあります")
Python🔍 ステップ解説:
- 「Noneでなく、長さが0より大きい」条件 →
and。 - もし関数内なら、早期リターンを使うともっときれい:
- 条件に合わないときはすぐ
return - ネストを一段減らせる(これが“平坦化”)
- 条件に合わないときはすぐ
Q7:複雑なelif連鎖
元のコード:
if season == "春":
if weather == "晴れ":
print("お花見日和です")
Python✅ 解答例:
if season == "春" and weather == "晴れ":
print("お花見日和です")
Python🔍 ステップ解説:
- どちらの条件も同時に成立したら実行。
- →
andで条件を1つに統合。 - これによりネスト構造を1段カット。
Q8:ネスト+否定条件
元のコード:
if not canceled:
if paid:
print("予約が確定しました")
Python✅ 解答例:
if not canceled and paid:
print("予約が確定しました")
Python🔍 ステップ解説:
- 「キャンセルされていない」かつ「支払い済み」
→ 2つの条件をandで結合。 not canceledの否定条件もそのまま使える。
Q9:多段ネスト + elseブロック
元のコード:
if user == "admin":
if password == "1234":
print("ログイン成功")
else:
print("パスワードが違います")
else:
print("ユーザーが存在しません")
Python✅ 解答例:
if user != "admin":
print("ユーザーが存在しません")
elif password != "1234":
print("パスワードが違います")
else:
print("ログイン成功")
Python🔍 ステップ解説:
- 条件を「通らない場合」から先に処理すると平坦化できる。
if user != "admin":のように否定で早期分岐。- これによりネストが一気に消える。
- このスタイルは「早期return」同様、実務でも好まれる。
Q10:実務的なネスト構造
元のコード:
if request:
if request.get("user"):
if request["user"].get("active"):
print("アクティブなユーザーです")
Python✅ 解答例:
if request and "user" in request and request["user"].get("active"):
print("アクティブなユーザーです")
Python🔍 ステップ解説:
- すべての条件が満たされて初めて実行。
- 各層を
andで結合して直線的に並べる。 request.get("user")と"user" in requestはどちらでもOK。
明示的に"user" in requestを使うと安全。
まとめ:ネスト平坦化のコツ
| コツ | 説明 |
|---|---|
✅ 条件をまとめられるなら and で結合 | 重複した if を1行に |
✅ elif で「else内のif」を平坦化 | ネスト1段削減 |
| ✅ 否定条件+早期return | 深いネストを回避 |
✅ 連鎖比較 (0 < x < 10) | 範囲条件を1行に |
| ✅ 条件の順番を「除外 → 本命」順に | ロジックが読みやすく |


