5日目のゴールと今日やること
5日目のテーマは
「while と終了条件を“メニュー付きアプリ”の中で使いこなすこと」です。
ここまでであなたは、
1つの while の中で「入力 → 判定 → 保存 → 終了条件」を
かなり自由に設計できるようになりました。
今日は一歩進めて、
- メニューを表示して、ユーザーに「何をするか」選んでもらう
- 「メモを追加する while」と「アプリ全体を続ける while」を分ける
- 終了条件を“階層的”に考える
という、実際のアプリに近い構造を扱っていきます。
今日の完成イメージ:メニュー付きメモアプリ
どんな動きを目指すか
ざっくり、こんなアプリを目指します。
- メニューを表示する
- 1: メモを追加する
- 2: メモ一覧を見る
- 3: 終了する
- 「1: メモを追加する」を選んだら、
これまでやってきた「繰り返し入力メモ」の while に入る。 - 「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
- choice が “3” →
- 内側の終了条件(メモ追加モード)
- “終了” / “end” →
break - 最大件数に達した →
break
- “終了” / “end” →
外側の while は「アプリ全体の流れ」を管理し、
内側の while は「メモ追加モードの流れ」を管理しています。
深掘り:終了条件を“階層で考える”ということ
1つの while に全部詰め込まない理由
もし、メニューもメモ追加も全部 1 つの while に詰め込むと、
条件分岐だらけで一気に読みにくくなります。
そこで、
- アプリ全体を回す while(外側)
- 特定の機能を回す while(内側)
というふうに、
「責任の範囲」でループを分けます。
終了条件も同じです。
- 外側の終了条件:アプリを終わらせる条件
- 内側の終了条件:そのモードを終わらせる条件
この“階層構造”を意識できると、
アプリが大きくなっても、
どこに何を書けばいいか迷いにくくなります。
while の役割を言葉にしてみる
このコードでは、
外側の while の役割は
「ユーザーに次に何をするか選んでもらう」こと。
内側の while の役割は
「選ばれたモードの中で、繰り返し処理をする」こと。
終了条件は、それぞれの while の“責任範囲”の中で完結しています。
5日目の流れを日本語でなぞる
今日のコード全体を、
あえて日本語だけで説明してみます。
- 空の
memosリストを用意する。 running = Trueとして、アプリ全体の while を始める。- メニューを表示して、ユーザーに 1〜3 の番号を入力してもらう。
- “1” なら、
add_memos関数を呼んで「メモ追加モード」に入る。- ここでは別の while が動き、終了 / end で抜ける。
- “2” なら、
memosの中身を一覧表示する。 - “3” なら、
running = Falseにしてアプリ全体の while を終わらせる。 - それ以外なら、「不正な入力」と表示してメニューに戻る。
終了条件は 2 段階あります。
- メモ追加モードの終了条件(内側の while)
- アプリ全体の終了条件(外側の while)
これを整理して考えられていれば、
while と終了条件を「アプリの構造」として扱えている状態です。
今日いちばん深く理解してほしいこと
5日目の本質は、
「while と終了条件は“1個のループの中だけ”で完結させなくていい。
アプリ全体とモードごとに、階層的に設計していい」
ということです。
外側の while はアプリ全体の流れ。
内側の while は特定の機能の流れ。
それぞれに終了条件があり、
それぞれの責任範囲の中で完結している。
あなたはもう、
「while が書ける人」から
「while をアプリの構造として使える人」にかなり近づいています。
6日目以降は、
このメニュー構造の中に「保存先(ファイル)」や
「検索」「削除」などを足していきながら、
終了条件とループ設計の感覚をさらに磨いていきましょう。


