Python | 1 日 90 分 × 7 日アプリ学習:繰り返し入力メモアプリ(初級編)

Web APP Python
スポンサーリンク

5日目のゴールと今日やること

5日目のテーマは
while と終了条件を“メニュー付きアプリ”の中で使いこなすこと」です。

ここまでであなたは、
1つの while の中で「入力 → 判定 → 保存 → 終了条件」を
かなり自由に設計できるようになりました。

今日は一歩進めて、

  • メニューを表示して、ユーザーに「何をするか」選んでもらう
  • 「メモを追加する while」と「アプリ全体を続ける while」を分ける
  • 終了条件を“階層的”に考える

という、実際のアプリに近い構造を扱っていきます。


今日の完成イメージ:メニュー付きメモアプリ

どんな動きを目指すか

ざっくり、こんなアプリを目指します。

  1. メニューを表示する
    • 1: メモを追加する
    • 2: メモ一覧を見る
    • 3: 終了する
  2. 「1: メモを追加する」を選んだら、
    これまでやってきた「繰り返し入力メモ」の while に入る。
  3. 「3: 終了する」を選んだら、アプリ全体を終了する。

ここでのポイントは、

「アプリ全体を回す while」と
「メモ入力を回す while」が
二重構造になることです。

終了条件も「外側」と「内側」に分かれます。


外側の while:アプリ全体のループ

まずはメニューだけの while を考える

いきなり全部書かずに、
まずは「メニューを表示して選択を受け取る」だけの while を考えます。

running = True

while running:
    print("==== メニュー ====")
    print("1: メモを追加する")
    print("2: メモ一覧を見る")
    print("3: 終了する")

    choice = input("番号を入力してください:").strip()

    if choice == "1":
        print("メモ追加モードに入ります")
        # ここで「メモ入力の while 」を呼び出す予定
    elif choice == "2":
        print("メモ一覧を表示します(あとで実装)")
    elif choice == "3":
        print("アプリを終了します")
        running = False
    else:
        print("不正な入力です。1〜3 の番号を入力してください。")
Python

ここでの終了条件はシンプルです。

  • choice が “3” のとき、running = False にして while を終わらせる

これは「アプリ全体の終了条件」です。


内側の while:メモ入力専用のループ

これまで作ってきた「繰り返し入力メモ」を関数にする

今度は、
「メモを追加する」部分を関数として切り出します。

def add_memos(memos, max_memos=5):
    print("メモ追加モードです。終了 / end でメモ追加を終わります。")
    print(f"現在 {len(memos)} 件 / 最大 {max_memos} 件")

    while True:
        raw = input("メモを入力してください:")
        text = raw.strip()
        normalized = text.lower()

        if normalized == "終了" or normalized == "end":
            print("メモ追加モードを終了します")
            break

        if text == "":
            print("空のメモは保存しません")
            continue

        if text in memos:
            print("同じメモがすでに登録されています")
            continue

        if len(memos) >= max_memos:
            print("メモの最大件数に達しました。これ以上追加できません。")
            break

        memos.append(text)
        print(f"追加しました(現在 {len(memos)} 件)")
Python

この関数の中にも、
はっきりした終了条件があります。

  • ユーザー終了条件:終了 / end と入力されたら break
  • アプリ終了条件:メモ数が max_memos に達したら break

この while は「メモ追加モードの中だけで完結する終了条件」を持っています。


外側と内側の while をつなげる

メニューから「メモ追加モード」を呼び出す

さっきの add_memos 関数を、
外側の while から呼び出します。

def add_memos(memos, max_memos=5):
    print("メモ追加モードです。終了 / end でメモ追加を終わります。")
    print(f"現在 {len(memos)} 件 / 最大 {max_memos} 件")

    while True:
        raw = input("メモを入力してください:")
        text = raw.strip()
        normalized = text.lower()

        if normalized == "終了" or normalized == "end":
            print("メモ追加モードを終了します")
            break

        if text == "":
            print("空のメモは保存しません")
            continue

        if text in memos:
            print("同じメモがすでに登録されています")
            continue

        if len(memos) >= max_memos:
            print("メモの最大件数に達しました。これ以上追加できません。")
            break

        memos.append(text)
        print(f"追加しました(現在 {len(memos)} 件)")


memos = []
running = True

while running:
    print("==== メニュー ====")
    print("1: メモを追加する")
    print("2: メモ一覧を見る")
    print("3: 終了する")

    choice = input("番号を入力してください:").strip()

    if choice == "1":
        add_memos(memos, max_memos=5)
    elif choice == "2":
        print("==== メモ一覧 ====")
        if not memos:
            print("まだメモがありません")
        else:
            for i, memo in enumerate(memos, start=1):
                print(f"{i}: {memo}")
    elif choice == "3":
        print("アプリを終了します")
        running = False
    else:
        print("不正な入力です。1〜3 の番号を入力してください。")
Python

ここで、終了条件を“階層”で見てみます。

  • 外側の終了条件(アプリ全体)
    • choice が “3” → running = False
  • 内側の終了条件(メモ追加モード)
    • “終了” / “end” → break
    • 最大件数に達した → break

外側の while は「アプリ全体の流れ」を管理し、
内側の while は「メモ追加モードの流れ」を管理しています。


深掘り:終了条件を“階層で考える”ということ

1つの while に全部詰め込まない理由

もし、メニューもメモ追加も全部 1 つの while に詰め込むと、
条件分岐だらけで一気に読みにくくなります。

そこで、

  • アプリ全体を回す while(外側)
  • 特定の機能を回す while(内側)

というふうに、
「責任の範囲」でループを分けます。

終了条件も同じです。

  • 外側の終了条件:アプリを終わらせる条件
  • 内側の終了条件:そのモードを終わらせる条件

この“階層構造”を意識できると、
アプリが大きくなっても、
どこに何を書けばいいか迷いにくくなります。

while の役割を言葉にしてみる

このコードでは、

外側の while の役割は
「ユーザーに次に何をするか選んでもらう」こと。

内側の while の役割は
「選ばれたモードの中で、繰り返し処理をする」こと。

終了条件は、それぞれの while の“責任範囲”の中で完結しています。


5日目の流れを日本語でなぞる

今日のコード全体を、
あえて日本語だけで説明してみます。

  1. 空の memos リストを用意する。
  2. running = True として、アプリ全体の while を始める。
  3. メニューを表示して、ユーザーに 1〜3 の番号を入力してもらう。
  4. “1” なら、add_memos 関数を呼んで「メモ追加モード」に入る。
    • ここでは別の while が動き、終了 / end で抜ける。
  5. “2” なら、memos の中身を一覧表示する。
  6. “3” なら、running = False にしてアプリ全体の while を終わらせる。
  7. それ以外なら、「不正な入力」と表示してメニューに戻る。

終了条件は 2 段階あります。

  • メモ追加モードの終了条件(内側の while)
  • アプリ全体の終了条件(外側の while)

これを整理して考えられていれば、
while と終了条件を「アプリの構造」として扱えている状態です。


今日いちばん深く理解してほしいこと

5日目の本質は、

「while と終了条件は“1個のループの中だけ”で完結させなくていい。
アプリ全体とモードごとに、階層的に設計していい」

ということです。

外側の while はアプリ全体の流れ。
内側の while は特定の機能の流れ。

それぞれに終了条件があり、
それぞれの責任範囲の中で完結している。

あなたはもう、
「while が書ける人」から
「while をアプリの構造として使える人」にかなり近づいています。

6日目以降は、
このメニュー構造の中に「保存先(ファイル)」や
「検索」「削除」などを足していきながら、
終了条件とループ設計の感覚をさらに磨いていきましょう。

タイトルとURLをコピーしました