Python | ネストを平坦化する練習問題セット

Python
スポンサーリンク

では、先ほどの ネスト平坦化 練習問題セット(10問)
それぞれに「✅解答例」と「🔍ステップごとの解説」を付けて丁寧に説明していきます。


🧩 ネスト平坦化 練習問題セット:解答&解説


Q1:単純な2段ネスト

元のコード:

if x > 0:
    if x < 10:
        print("1桁の正の数です")
Python

✅ 解答例(平坦化後):

if 0 < x < 10:
    print("1桁の正の数です")
Python

🔍 ステップ解説:

  1. if x > 0: の中にもう一つ if x < 10: がある。
    → 「x が 0 より大きく、かつ 10 未満」のときだけ実行される。
  2. つまり両方が「同時に真」である必要がある。
    and で条件をまとめられる。
  3. 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

🔍 ステップ解説:

  1. else の中に if が入っている → ネストが深くなる。
  2. 「最初の条件がダメだったら次の条件をチェックする」
    という構造は elif が最適。
  3. elifelse + if の省略形なので、すっきり書ける。

Q3:3段ネスト

元のコード:

if age >= 0:
    if age < 13:
        if gender == "男":
            print("少年です")
Python

✅ 解答例:

if 0 <= age < 13 and gender == "男":
    print("少年です")
Python

🔍 ステップ解説:

  1. 3つの条件すべて満たすときだけ print
  2. すべて「and」でつながる関係。
    if 条件1 and 条件2 and 条件3: にまとめられる。
  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

🔍 ステップ解説:

  1. if temp > 0: の中にさらに if temp < 25:
    → 条件の組み合わせがややこしい。
  2. ネストを抜いて、値の範囲ごとに分岐すればOK。
  3. 条件の順に意味がつながる:
    • 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

🔍 ステップ解説:

  1. 外側の if で「数字かどうか」を確認。
  2. 内側の if で「数値に変換して正の数か」を確認。
  3. どちらも満たす必要がある → and でつなげる。
  4. 注意: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

🔍 ステップ解説:

  1. 「Noneでなく、長さが0より大きい」条件 → and
  2. もし関数内なら、早期リターンを使うともっときれい:
    • 条件に合わないときはすぐreturn
    • ネストを一段減らせる(これが“平坦化”)

Q7:複雑なelif連鎖

元のコード:

if season == "春":
    if weather == "晴れ":
        print("お花見日和です")
Python

✅ 解答例:

if season == "春" and weather == "晴れ":
    print("お花見日和です")
Python

🔍 ステップ解説:

  1. どちらの条件も同時に成立したら実行。
  2. and で条件を1つに統合。
  3. これによりネスト構造を1段カット。

Q8:ネスト+否定条件

元のコード:

if not canceled:
    if paid:
        print("予約が確定しました")
Python

✅ 解答例:

if not canceled and paid:
    print("予約が確定しました")
Python

🔍 ステップ解説:

  1. 「キャンセルされていない」かつ「支払い済み」
    → 2つの条件を and で結合。
  2. 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

🔍 ステップ解説:

  1. 条件を「通らない場合」から先に処理すると平坦化できる。
  2. if user != "admin": のように否定で早期分岐
  3. これによりネストが一気に消える。
  4. このスタイルは「早期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

🔍 ステップ解説:

  1. すべての条件が満たされて初めて実行。
  2. 各層を and で結合して直線的に並べる。
  3. request.get("user")"user" in request はどちらでもOK。
    明示的に "user" in request を使うと安全。

まとめ:ネスト平坦化のコツ

コツ説明
✅ 条件をまとめられるなら and で結合重複した if を1行に
elif で「else内のif」を平坦化ネスト1段削減
✅ 否定条件+早期return深いネストを回避
✅ 連鎖比較 (0 < x < 10)範囲条件を1行に
✅ 条件の順番を「除外 → 本命」順にロジックが読みやすく
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました