3日目のゴールと今日やること
3日目のテーマは
「while に“回数制限”や“複数の終了条件”を組み合わせて、現実のアプリっぽくすること」です。
ここまでであなたは、
「終了と入力されたら終わる」
「空文字はスキップする」
「終了条件とスキップ条件を分けて考える」
というところまで来ています。
今日はそこに、
「メモの最大件数」
「入力できる回数の上限」
「ユーザー都合の終了」と「アプリ都合の終了」
を足して、while と終了条件を“設計”として扱う感覚まで持っていきます。
終了条件には「誰の都合か」という種類がある
ユーザーが終わらせる終了条件
まず一つ目は、
ユーザーが「もう終わり」と決める終了条件です。
例えば、
「終了」と入力したら終わり
「end」と入力したら終わり
これは「ユーザーの意思」です。
アプリはそれを尊重して、すぐにループを抜けるべきです。
アプリが終わらせる終了条件
もう一つは、
アプリ側が「ここまで」と決める終了条件です。
例えば、
メモは最大 5 件まで
入力チャンスは最大 10 回まで
これは「アプリの都合」です。
ユーザーがまだ続けたくても、
アプリのルールとして終了させます。
3日目では、この2種類を同時に扱います。
例題1:メモの最大件数を決める while
日本語でルールを整理する
まずは、こういう仕様を考えます。
メモは最大 5 件まで保存できる。
ユーザーが「終了」と入力しても終わる。
5 件たまったら、自動的に入力を終わる。
ここには、終了条件が 2 つあります。
ユーザー終了条件:「終了」と入力されたら終わり。
アプリ終了条件:メモが 5 件に達したら終わり。
これを while の中に落とし込みます。
コードで書いてみる
memos = []
max_memos = 5
while True:
print(f"現在 {len(memos)} 件 / 最大 {max_memos} 件")
raw = input("メモを入力してください(終了 と入力で終わり):")
text = raw.strip()
if text == "終了":
print("ユーザーによって終了されました")
break
if text == "":
print("空のメモは保存しません")
continue
if text in memos:
print("同じメモがすでに登録されています")
continue
memos.append(text)
if len(memos) >= max_memos:
print("最大件数に達したので終了します")
break
print("入力されたメモ一覧:")
for memo in memos:
print("-", memo)
Pythonここでの流れを、言葉でなぞります。
入力を受け取る。
「終了」なら、ユーザー都合で即終了。
空文字・重複なら、その入力だけスキップ。
メモを追加したあと、「最大件数に達したか」を確認。
達していれば、アプリ都合で終了。
終了条件は 2 つあるけれど、
どちらも break で表現されている、というのがポイントです。
深掘り:終了条件の「順番」をどう決めるか
なぜこの順番なのかを言語化する
順番には意味があります。
最初に「終了」と入力されたかを見る。
これは「もう何もしたくない」というユーザーの意思なので、最優先。
次に「スキップ条件」(空文字・重複)を見る。
これは「保存しないだけ」で、アプリは続けたい。
最後に「最大件数」を見る。
これは「保存した結果として、もう限界に達したか」を確認している。
もし順番を変えると、挙動も変わります。
例えば、
メモを追加する前に len(memos) >= max_memos を見てしまうと、
「最後の 1 件」が保存されない、というズレが出ます。
ここで学んでほしいのは、
終了条件は「何を優先したいか」で順番が決まる
という感覚です。
例題2:入力回数に上限をつける while
日本語で仕様を決める
次は、こういう仕様を考えます。
ユーザーが「終了」と入力したら終わり。
それとは別に、「入力チャンスは最大 10 回まで」。
10 回入力したら、たとえメモが少なくても終わり。
ここでは「回数」を終了条件にします。
カウンタ変数で「試行回数」を数える
memos = []
max_trials = 10
trial_count = 0
while True:
print(f"{trial_count + 1} 回目の入力(最大 {max_trials} 回)")
raw = input("メモを入力してください(終了 と入力で終わり):")
text = raw.strip()
trial_count += 1
if text == "終了":
print("ユーザーによって終了されました")
break
if text == "":
print("空のメモは保存しません")
if trial_count >= max_trials:
print("入力回数の上限に達したので終了します")
break
continue
if text in memos:
print("同じメモがすでに登録されています")
if trial_count >= max_trials:
print("入力回数の上限に達したので終了します")
break
continue
memos.append(text)
if trial_count >= max_trials:
print("入力回数の上限に達したので終了します")
break
print("入力されたメモ一覧:")
for memo in memos:
print("-", memo)
Pythonここでの設計はこうです。
trial_count は「Enter を押した回数」を数えている。
空文字や重複でも「1 回分のチャンスを使った」とみなしている。
つまり、
「入力を試みた回数」に上限をつけている、という考え方です。
「何を数えるか」を自分で決めるということ
回数制限の設計は“正解”ではなく“選択”
さっきの例では、
「Enter を押した回数」を数えていましたが、
こういう設計もありえます。
「有効なメモが保存された回数だけを数える」
つまり、memos.append(text) したときだけカウントを増やす、という設計です。
その場合は、こう書き換えます。
memos = []
max_memos = 5
while True:
raw = input("メモを入力してください(終了 と入力で終わり):")
text = raw.strip()
if text == "終了":
break
if text == "":
print("空のメモは保存しません")
continue
if text in memos:
print("同じメモがすでに登録されています")
continue
memos.append(text)
if len(memos) >= max_memos:
print("有効なメモが最大件数に達したので終了します")
break
Pythonここでは「保存されたメモの数」だけを見ています。
どちらが正しい、ではなく、
「何を数えるかを自分で決める」
というのが大事なポイントです。
while の条件式に「続ける条件」を直接書くパターン
ずっと while True を使ってきた理由
ここまでは、あえて while True: を使ってきました。
理由は、
終了条件を if と break で“目に見える形”にしたかったから。
でも、while の条件式に
「続けてよい条件」を直接書くこともできます。
例:メモ数に上限がある場合
memos = []
max_memos = 5
while len(memos) < max_memos:
raw = input("メモを入力してください(終了 と入力で終わり):")
text = raw.strip()
if text == "終了":
print("ユーザーによって終了されました")
break
if text == "":
print("空のメモは保存しません")
continue
if text in memos:
print("同じメモがすでに登録されています")
continue
memos.append(text)
print("入力されたメモ一覧:")
for memo in memos:
print("-", memo)
Pythonここでは、
「メモ数が max_memos 未満の間だけ続ける」
という条件を while に直接書いています。
それでも「ユーザー終了条件」は中で break しています。
3日目の本質を一言でまとめる
3日目で一番つかんでほしいのは、これです。
終了条件は 1 個じゃなくていい。
「誰の都合で終わるのか(ユーザーかアプリか)」を意識して設計する。
ユーザー終了条件 → 入力内容で決まる(”終了” など)。
アプリ終了条件 → 上限や制約で決まる(最大件数・最大回数など)。
どちらも最終的には break で表現される。
スキップ条件は continue で表現される。
そして必ず、
日本語でルールを書く。
何を数えるかを決める。
変数と if と break / continue に落とし込む。
この流れさえ守っていれば、
while と終了条件はもう「怖いもの」ではなく、
あなたがコントロールできる“道具”になっています。


