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

Web APP Python
スポンサーリンク

6日目のゴール

6日目のテーマは
「list と append を“自分で評価・改善できるレベル”にすること」です。

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

list をアプリの“記憶”として使う
append でデータを追加する
条件つきで append する
複数の list で状態を分ける
関数に分けて整理する

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

今日はそこから一歩進んで、

「この書き方で本当にいいのか?」と自分で見直す
同じパターンをきれいにまとめ直す
list と append の“クセ”を理解して、ミスを減らす

という、“設計を評価する目”を育てます。


今のコードを「言葉で説明してみる」

自分のアプリを日本語で分解する

まず、5日目までの TODO アプリを
あえて日本語で説明してみます。

未完了タスクを入れる list がある
完了タスクを入れる list がある
タスクを追加する関数がある
タスクを完了にする関数がある
現在の状態を表示する関数がある

ここで大事なのは、

「list は何を表しているのか」
「append はどんなときに呼ばれているのか」

を、自分の言葉で説明できることです。

もしここがふわっとしているなら、
コードをいじる前に「言葉」を整えた方が早いです。


「同じことを何度も書いていないか」を見る

追加処理の中にある“お決まりパターン”

例えば、タスク追加の関数を見てみます。

入力を受け取る
終了かどうかを判定する
空文字かどうかをチェックする
すでにあるかどうかをチェックする
OK なら append する

この流れ、
実は「買い物リスト」でも「名前リスト」でも
ほとんど同じことをやっています。

つまり、
「入力 → バリデーション → append」
というパターンが、何度も出てきているわけです。

ここで一歩進んで、
このパターンを“汎用的な関数”にしてみます。


「汎用的な追加関数」を作ってみる

どんな list にも使える add_with_rules

「どの list にも使える“追加関数”」を考えてみます。

やりたいことはこうです。

どの list に追加するかを引数で受け取る
何を追加するかも引数で受け取る
「空はダメ」「重複はダメ」というルールを共通化する

コードにすると、こうなります。

def add_with_rules(items, value):
    text = value

    if text.strip() == "":
        print("空の入力は追加できません")
        return False

    if text in items:
        print("すでにリストにあります:", text)
        return False

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

これを使うと、
買い物リストでも TODO リストでも、
こう書けます。

shopping_list = []
add_with_rules(shopping_list, "りんご")

todos = []
add_with_rules(todos, "掃除する")
Python

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

「list と append の“お決まりの前後処理”を
1つの関数にまとめた」

ということです。


「入力を受け取る部分」と「追加する部分」を分ける

役割を分けると、あとから直しやすくなる

今までは、
「input で受け取る」と「append する」が
同じ関数の中に混ざっていました。

これを、あえて分けてみます。

入力を受け取る関数
受け取った値を list に追加する関数

という分け方です。

def input_text(prompt):
    return input(prompt)


def add_with_rules(items, text):
    if text.strip() == "":
        print("空の入力は追加できません")
        return False

    if text in items:
        print("すでにリストにあります:", text)
        return False

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

使う側はこうなります。

shopping_list = []

while True:
    text = input_text("追加するもの(終了は『終了』): ")

    if text == "終了":
        break

    add_with_rules(shopping_list, text)

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

ここでの深掘りポイントは、

「input の仕様が変わっても(GUI にするとか)、
add_with_rules はそのまま使える」

ということです。

list と append を扱う“ロジック”と
ユーザーからの“入力方法”を分ける

これが、設計としてかなり大事な一歩です。


append の“クセ”をもう一度ちゃんと理解する

「その場で書き換える」ことの意味

append の本質は、

「list 自体を、その場で書き換える」

というところにあります。

つまり、

items.append(x) と書いた瞬間に
items の中身が変わる

ということです。

ここで、やってはいけない書き方をもう一度確認します。

items = []
items = items.append("りんご")  # これはダメ
Python

append は「何も返さない」ので、
items には None が入ってしまいます。

6日目の視点では、
ここをもう一段深く理解してほしいです。

「append は“結果を返す関数”ではなく
“対象を直接変える命令”である」

だから、

「append の戻り値を変数に入れない」
「append を if の条件に使わない」

というルールを、自分の中に持っておくと安全です。


「list を返す関数」と「list を書き換える関数」を区別する

設計としての大事な線引き

例えば、こんな2つの関数を考えます。

def add_and_return_new(items, value):
    new_items = items.copy()
    new_items.append(value)
    return new_items


def add_in_place(items, value):
    items.append(value)
Python

前者は
「元の list は変えずに、新しい list を返す」関数。
後者は
「元の list をその場で書き換える」関数。

Python の append は、完全に後者のタイプです。

6日目では、
「自分が今書いている関数はどっちのタイプか?」
を意識してみてください。

アプリの設計としては、

「アプリの“状態”を表す list は、基本的に書き換える」
「一時的な計算用の list は、新しく作って返す」

という使い分けができると、
コードの見通しがかなり良くなります。


6日目のミニアプリ:汎用追加関数を使った買い物リスト

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

def input_text(prompt):
    return input(prompt)


def add_with_rules(items, text):
    if text.strip() == "":
        print("空の入力は追加できません")
        return False

    if text in items:
        print("すでにリストにあります:", text)
        return False

    items.append(text)
    print("追加しました:", text)
    return True


def show_list(items, title="現在のリスト"):
    print(f"\n{title}:")
    if len(items) == 0:
        print("  (何も登録されていません)")
    else:
        for index, value in enumerate(items, start=1):
            print(f"  {index}: {value}")
    print()


def main():
    shopping_list = []

    print("買い物リストアプリ(6日目バージョン)")
    print("終了したいときは『終了』と入力。")

    while True:
        text = input_text("追加するもの: ")

        if text == "終了":
            break

        added = add_with_rules(shopping_list, text)
        if added:
            show_list(shopping_list)

    show_list(shopping_list, title="最終的なリスト")
    print("アプリを終了します。")


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

ここで注目してほしいのは、

入力を受け取る関数
追加のルールをまとめた関数
表示を担当する関数

が分かれていて、
どれも中で listappend を扱っていることです。

「list と append を、
“バラバラに書く”のではなく
“意味ごとにまとめて扱う”」

これが、6日目で身につけたい感覚です。


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

今日の本質は、
「list と append を“設計の単位”として扱う」ことです。

list はアプリの状態そのもの
append はその状態を変える命令
入力・追加・表示を関数ごとに分けると、頭もコードも整理される
「どこで list を変えているか」が一目で分かる設計にする

ここまで来ると、
あなたはもう「list と append を知っている人」ではなく、
「list と append を使ってアプリの形を考えられる人」になっています。

7日目は、
この1週間で作ったものを
「自分の言葉で説明し直す・評価し直す」
という締めのフェーズに入っていきます。

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