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

Web APP Python
スポンサーリンク

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 と終了条件はもう「怖いもの」ではなく、
あなたがコントロールできる“道具”になっています。

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