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この中で、list と append はずっと主役です。
未完了タスクの list
完了タスクの list
追加するときの append
状態を移すときの append
全部「list と append」だけで成り立っています。
5日目のまとめ:今日つかんでほしい感覚
今日、いちばん持ち帰ってほしいのはこの感覚です。
list は「状態の集まり」
append は「その状態を増やす動き」
関数は「状態をどう変えるか」をまとめた“意味のかたまり”
複数の list を使うと「状態の違い」を表現できる
ここまで来ると、
あなたはもう「list と append を知っている人」ではなく、
「list と append でアプリの状態を設計できる人」になり始めています。
6日目以降は、
この設計の感覚をもう少しだけ深めていく方向に進めます。


