Python | ネスト平坦化 練習問題

Python
スポンサーリンク

ここでは、「ネスト(入れ子)を平坦化して読みやすく書き直す練習」に特化した10問セットを用意しました。

各問題は

  • Step1:ネストされた悪い例(Before)
  • Step2:課題(どう平坦化すべきか)
  • Step3:模範解答(After)
    で構成されています。
    初心者が「なぜそう書き換えるのか」まで理解できるようにしています。

Q1:ログイン判定

Before(ネストあり)

def login(user, password):
    if user == "alice":
        if password == "1234":
            print("ログイン成功")
        else:
            print("パスワードが違います")
    else:
        print("ユーザーが存在しません")
Python

課題

  • 深いネストを解消しよう。
  • 条件を逆にして「早期リターン」に書き換える。

After(平坦化)

def login(user, password):
    if user != "alice":
        print("ユーザーが存在しません")
        return
    if password != "1234":
        print("パスワードが違います")
        return
    print("ログイン成功")
Python

Q2:年齢と身長チェック

Before

if age >= 18:
    if height >= 160:
        print("合格")
    else:
        print("身長が足りません")
else:
    print("年齢が足りません")
Python

After

if age < 18:
    print("年齢が足りません")
elif height < 160:
    print("身長が足りません")
else:
    print("合格")
Python

Q3:在庫と会員判定

Before

if in_stock:
    if is_member:
        print("購入可能です")
    else:
        print("会員登録してください")
else:
    print("在庫切れです")
Python

After

if not in_stock:
    print("在庫切れです")
elif not is_member:
    print("会員登録してください")
else:
    print("購入可能です")
Python

Q4:テスト結果(点数+提出)

Before

if score >= 60:
    if submitted:
        print("合格")
    else:
        print("未提出です")
else:
    print("不合格")
Python

After

if score < 60:
    print("不合格")
elif not submitted:
    print("未提出です")
else:
    print("合格")
Python

Q5:電車乗車判定

Before

if has_ticket:
    if balance >= 200:
        print("乗車できます")
    else:
        print("残高不足です")
else:
    print("切符がありません")
Python

After

if not has_ticket:
    print("切符がありません")
elif balance < 200:
    print("残高不足です")
else:
    print("乗車できます")
Python

Q6:ファイル操作のチェック

Before

if exists:
    if readable:
        print("読み込み開始")
    else:
        print("ファイルが読めません")
else:
    print("ファイルが存在しません")
Python

After

if not exists:
    print("ファイルが存在しません")
elif not readable:
    print("ファイルが読めません")
else:
    print("読み込み開始")
Python

Q7:アクセス制御(役職+パスワード)

Before

if role == "admin":
    if password == "root":
        print("アクセス許可")
    else:
        print("パスワードエラー")
else:
    print("管理者のみアクセス可能")
Python

After

if role != "admin":
    print("管理者のみアクセス可能")
elif password != "root":
    print("パスワードエラー")
else:
    print("アクセス許可")
Python

Q8:支払い条件(会員・ポイント)

Before

if is_member:
    if points >= 100:
        print("ポイント払いOK")
    else:
        print("ポイントが足りません")
else:
    print("会員登録が必要です")
Python

After

if not is_member:
    print("会員登録が必要です")
elif points < 100:
    print("ポイントが足りません")
else:
    print("ポイント払いOK")
Python

Q9:フォーム入力チェック

Before

if name != "":
    if email != "":
        print("送信完了")
    else:
        print("メールアドレスを入力してください")
else:
    print("名前を入力してください")
Python

After

if name == "":
    print("名前を入力してください")
elif email == "":
    print("メールアドレスを入力してください")
else:
    print("送信完了")
Python

Q10:学生の進級判定

Before

if grade >= 2:
    if credit >= 30:
        print("進級できます")
    else:
        print("単位不足です")
else:
    print("1年生は対象外です")
Python

After

if grade < 2:
    print("1年生は対象外です")
elif credit < 30:
    print("単位不足です")
else:
    print("進級できます")
Python

総まとめ:ネスト平坦化の基本ルール

ルール説明
❌ ネスト構造で深く書かない見づらく、バグの温床
✅ 条件を逆にして「早期終了」if not ...: return で整理
✅ elifで段階的に書く「Aがダメ→Bがダメ→OK」で自然な流れ
✅ 関数化・戻り値化出力とロジックを分離すると使いやすい
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました