Python | 1 日 90 分 × 7 日アプリ学習:リストに追加するアプリ(初級編)

Web APP Python
スポンサーリンク

5日目のゴール

5日目のテーマは
「list と append を“ちゃんと設計して使う段階”に進むこと」です。

ここまでであなたはすでに、

空の list を用意して
append で追加して
バリデーションして
重複を防いで
見やすく表示する

というところまで来ています。

5日目では、そこから一歩進めて、

関数に分けて整理する
複数の list を使い分ける
「状態の変化」を意識して設計する

という、“ちょっとだけ設計寄りの視点”を入れていきます。


list と append を「関数の中に閉じ込める」

そのまま書き続けるとコードがぐちゃぐちゃになる

今までのコードは、
1つの while の中に

入力
バリデーション
重複チェック
確認
追加
表示

が全部入っていました。

学ぶ段階ではそれでいいのですが、
アプリとしてはだんだん読みにくくなります。

そこで、
「意味のかたまりごとに関数に分ける」
ということをやってみます。

追加処理を関数にする

まずは「1件追加する処理」を関数に切り出します。

def add_item(shopping_list):
    item = input("追加するもの: ")

    if item == "終了":
        return False  # 終了の合図

    if item.strip() == "":
        print("空の入力は追加できません")
        return True   # 続行

    if item in shopping_list:
        print("すでにリストにあります:", item)
        return True

    confirm = input(f"『{item}』を追加しますか? (y/n): ")

    if confirm.lower() != "y":
        print("追加をキャンセルしました")
        return True

    shopping_list.append(item)
    print("追加しました:", item)
    return True
Python

メインの流れはこうなります。

shopping_list = []

print("買い物リストアプリ")
print("終了したいときは『終了』と入力。")

while True:
    should_continue = add_item(shopping_list)
    if not should_continue:
        break

print("最終的なリスト:", shopping_list)
Python

ここでの重要ポイントは、

list 自体は関数の外で作る
関数には「どの list に追加するか」を渡す
append は関数の中で行う

という構造にしたことです。

「list はアプリの状態」
「関数はその状態を変える動き」
という分け方ができています。


関数化のメリットをちゃんと感じる

「何をしているか」が一文で言えるようになる

add_item 関数を日本語で説明すると、

「ユーザーに1件入力してもらい、
ルールに従って list に追加するかどうかを決める処理」

と一文で言えます。

この「一文で言える」というのが、
関数として“いいサイズ”です。

もし関数の中で
削除もしていて
並び替えもしていて
表示もしていて…

となると、
もう一文では説明できません。

関数に名前をつけることで、
自分の頭の中の整理も進みます。


複数の list を使い分けてみる

「未完了」と「完了」を分ける TODO リスト

ここまでずっと 1つの list だけを扱ってきましたが、
アプリでは「状態ごとに list を分ける」ことがよくあります。

例えば、TODO リスト。

未完了のタスク
完了したタスク

を別々の list で持つ、という設計です。

todos = []
done_todos = []
Python

追加は「未完了リスト」にだけ行う

def add_todo(todos):
    task = input("追加するタスク: ")

    if task == "終了":
        return False

    if task.strip() == "":
        print("空のタスクは追加できません")
        return True

    if task in todos:
        print("すでに登録されています:", task)
        return True

    todos.append(task)
    print("追加しました:", task)
    return True
Python

完了したタスクを「別の list に移す」

ここで、append の新しい使い方が出てきます。

「ある list から取り出して、別の list に append する」

def complete_todo(todos, done_todos):
    if len(todos) == 0:
        print("未完了のタスクはありません")
        return

    print("未完了のタスク:")
    for index, task in enumerate(todos, start=1):
        print(f"{index}: {task}")

    value = input("完了したタスクの番号を入力してください(キャンセルは空 Enter): ")

    if value.strip() == "":
        print("キャンセルしました")
        return

    try:
        index = int(value)
    except ValueError:
        print("数字を入力してください")
        return

    if index < 1 or index > len(todos):
        print("番号が範囲外です")
        return

    task = todos.pop(index - 1)
    done_todos.append(task)
    print("完了にしました:", task)
Python

ここでの重要ポイントは、

todos から pop で取り出す
取り出したものを done_todos.append(...) で別の list に移す

という「状態の移動」です。

append は
「新しく作る」だけでなく
“別の場所に移すときにも使える”

という感覚を持ってほしいです。


「状態の変化」として list+append を見る

ただ追加しているのではなく「状態を変えている」

TODO の例でいうと、

未完了 → 完了

という“状態の変化”が起きています。

コード的には、

未完了リストから削除
完了リストに追加

という2ステップですが、
アプリとしては「状態が変わった」と見なせます。

このとき、
list と append はこういう役割を持っています。

未完了リスト(list)
→ 今の状態を表す“入れ物”

pop
→ その状態から「1つ取り出す」動き

完了リスト(list)
→ 別の状態を表す“入れ物”

append
→ その状態に「1つ追加する」動き

つまり、
list は「状態の集まり」
append は「状態を増やす動き」

として見られるようになると、一気に設計の視点が育ちます。


5日目のミニアプリ:未完了/完了つき TODO アプリ(簡易版)

今日の学びをまとめたコード

少し長いですが、読む価値はあります。

def show_todos(todos, done_todos):
    print("\n=== TODO リスト ===")
    if len(todos) == 0:
        print("未完了: なし")
    else:
        print("未完了:")
        for index, task in enumerate(todos, start=1):
            print(f"  {index}: {task}")

    if len(done_todos) == 0:
        print("完了: なし")
    else:
        print("完了:")
        for index, task in enumerate(done_todos, start=1):
            print(f"  {index}: {task}")
    print("===================\n")


def add_todo(todos):
    task = input("追加するタスク(終了は『終了』): ")

    if task == "終了":
        return False

    if task.strip() == "":
        print("空のタスクは追加できません")
        return True

    if task in todos:
        print("すでに未完了リストにあります:", task)
        return True

    todos.append(task)
    print("追加しました:", task)
    return True


def complete_todo(todos, done_todos):
    if len(todos) == 0:
        print("未完了のタスクはありません")
        return

    print("未完了のタスク:")
    for index, task in enumerate(todos, start=1):
        print(f"{index}: {task}")

    value = input("完了したタスクの番号(キャンセルは空 Enter): ")

    if value.strip() == "":
        print("キャンセルしました")
        return

    try:
        index = int(value)
    except ValueError:
        print("数字を入力してください")
        return

    if index < 1 or index > len(todos):
        print("番号が範囲外です")
        return

    task = todos.pop(index - 1)
    done_todos.append(task)
    print("完了にしました:", task)


def main():
    todos = []
    done_todos = []

    print("TODO リストアプリ(5日目バージョン)")

    while True:
        show_todos(todos, done_todos)

        print("1: タスクを追加")
        print("2: タスクを完了にする")
        print("0: 終了")

        choice = input("番号を選んでください: ")

        if choice == "0":
            break
        elif choice == "1":
            should_continue = add_todo(todos)
            if not should_continue:
                break
        elif choice == "2":
            complete_todo(todos, done_todos)
        else:
            print("不正な入力です")

    print("アプリを終了します。")


if __name__ == "__main__":
    main()
Python

この中で、
listappend はずっと主役です。

未完了タスクの list
完了タスクの list
追加するときの append
状態を移すときの append

全部「list と append」だけで成り立っています。


5日目のまとめ:今日つかんでほしい感覚

今日、いちばん持ち帰ってほしいのはこの感覚です。

list は「状態の集まり」
append は「その状態を増やす動き」
関数は「状態をどう変えるか」をまとめた“意味のかたまり”
複数の list を使うと「状態の違い」を表現できる

ここまで来ると、
あなたはもう「list と append を知っている人」ではなく、
「list と append でアプリの状態を設計できる人」になり始めています。

6日目以降は、
この設計の感覚をもう少しだけ深めていく方向に進めます。

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