今回やること
Todoリストは、複数のタスクを扱う練習に向いています。
今回は安全に動作確認しやすいように、入力待ちではなく決まった操作を順番に実行します。
Todoは辞書、一覧はリスト、追加・完了・表示は別の関数に分けます。リスト操作、辞書操作、関数の基本を一つにまとめる制作です。
完成コード
todo_list.py を作ります。
todos = []
def add_todo(title):
todos.append({"title": title, "done": False})
def complete_todo(index):
if 0 <= index < len(todos):
todos[index]["done"] = True
def show_todos():
for index, todo in enumerate(todos):
mark = "x" if todo["done"] else " "
print(f"{index + 1}. [{mark}] {todo['title']}")
add_todo("Pythonを30分学習する")
add_todo("エラー文を読む練習をする")
add_todo("学習メモを書く")
complete_todo(1)
show_todos()
動作確認
python todo_list.py
次のように2番目だけ[x]になれば、基本関数の確認は成功です。
1. [ ] Pythonを30分学習する
2. [x] エラー文を読む練習をする
3. [ ] 学習メモを書く
対話メニューへ広げる
固定操作が動いたら、while文で「追加・一覧・完了・終了」を選ぶループへ広げます。表示番号は1始まりなので、完了関数へ渡す前にselected_number - 1へ変換します。
最初は追加と一覧だけを実装し、次に完了、最後に終了条件を加えます。一度に全メニューを書くより、各操作後にshow_todos()で状態を確認する方が原因を切り分けやすくなります。
固定した3回の関数呼び出しを削除し、代わりに次のループを置きます。
while True:
command = input("1:追加 2:一覧 3:完了 0:終了 > ").strip()
if command == "1":
add_todo(input("Todo: ").strip())
elif command == "2":
show_todos()
elif command == "3":
try:
selected_number = int(input("完了する番号: "))
except ValueError:
print("数字を入力してください")
continue
index = selected_number - 1
if 0 <= index < len(todos):
complete_todo(index)
else:
print("存在する番号を入力してください")
elif command == "0":
break
else:
print("0から3を入力してください")
コードの考え方
- Todoは辞書で表します
- Todo一覧はリストで持ちます
add_todoは追加担当ですcomplete_todoは完了担当ですshow_todosは表示担当です
よくあるエラー
| エラー | 原因 | 修正 |
|---|---|---|
IndexError | 存在しない番号を指定した | 範囲チェックを入れる |
| 完了にならない | done のキー名が違う | キー名を統一する |
| 表示がずれる | 0始まりと1始まりを混同 | 内部は0、表示は+1 |
数字以外や範囲外の番号ではデータを変更せず、案内を表示します。現在のリストはメモリ上だけにあるため、プログラムを終了すると消えます。保存はファイルの読み書きを学んだ後に追加します。
練習
- Todoを5件に増やす
- 1番目のTodoを完了にする
- 未完了だけ表示する関数を作る
次のステップ
次はTodoを再起動後も残せるよう、保存形式を一つ選んで追加します。