【Python関数入門】ToDoアプリをリファクタリング!整理されたコードの書き方
公開日: 2025年10月12日
前回の記事で、ToDoリストにファイル保存機能を追加しました。これでアプリはかなり実用的になりましたが、その代償としてプログラム全体が長くなり、whileループの中が少しごちゃごちゃしてきたと感じませんか?
「どこからどこまでが『追加』の処理で、どこからが『削除』の処理なのか」が一目で分かりにくくなっています。 コードが50行、100行と増えていくにつれ、この「分かりにくさ」は致命的な問題になります。
そこで今回は、この問題を解決するための、プログラミングにおける最も重要な概念の一つ、「関数 (function)」を学びます。 すでにあるコードの見た目や構造を、その機能を保ったまま改善することを「リファクタリング」と呼びます。さあ、あなたのToDoアプリをプロのコードに進化させましょう!
🔧 関数とは? なぜ必要なのか?
関数とは、一連の処理に名前を付けて、ひとまとめにした「部品」や「道具」のようなものです。 例えば、print() や input() も、Pythonがもともと用意してくれている便利な関数の一つです。
自分で関数を作るメリットは絶大です。
- 可読性の向上: add_task() という関数名を見るだけで「ああ、ここでタスクを追加しているんだな」と、処理の内容が一目瞭然になります。
- 再利用性の向上: 同じ処理を何度も書く必要がなくなり、作った関数を呼び出すだけでよくなります。
- メンテナンス性の向上: タスク追加のロジックにバグが見つかった時、修正箇所はその関数の中だけで済みます。
リファクタリング前のコード
まず、リファクタリング対象となる、前回の while ループを見てみましょう。全てのロジックがこのループの中に直接書かれています。
# while True: の中身 (リファクタリング前)
command = input(...)
if command == "add":
task = input(...)
todos.append(task)
save_todos(todos)
print("タスクを追加しました。")
elif command == "list":
print("--- ToDoリスト ---")
# ... 一覧表示のロジック ...
print("------------------")
elif command == "done":
# ... 完了処理の長いロジック ...
elif command == "exit":
break
# ...
🚀 ToDoアプリを関数でリファクタリングする
それでは、この if 文の中の各処理を、それぞれ独立した関数として切り出していきましょう。
1. 各機能の関数を定義する
「タスク追加」「一覧表示」「タスク完了」の3つの機能を、それぞれ add_task, list_tasks, complete_task という名前の関数として定義します。 これらの関数は todos リストを操作する必要があるので、引数として todos_list を受け取るように設計します。
def add_task(todos_list):
"""新しいタスクを追加する関数"""
task = input("追加するタスクを入力してください: ")
todos_list.append(task)
save_todos(todos_list) # 保存処理もここで行う
print("タスクを追加しました。")
def list_tasks(todos_list):
"""タスクを一覧表示する関数"""
print("--- ToDoリスト ---")
for i, task in enumerate(todos_list, start=1):
print(f"{i}: {task}")
print("------------------")
def complete_task(todos_list):
"""タスクを完了(削除)する関数"""
try:
done_index_str = input("完了にするタスクの番号を入力してください: ")
done_index = int(done_index_str) - 1
if 0 <= done_index < len(todos_list):
removed_task = todos_list.pop(done_index)
save_todos(todos_list) # 保存処理もここで行う
print(f"タスク「{removed_task}」を完了しました。")
else:
print("無効な番号です。")
except ValueError:
print("番号で入力してください。")
💡【重要】関数の「定義」と「呼び出し」
def を使って関数の設計図を作ることを「定義」と呼びます。定義しただけでは、その中の処理は実行されません。
作った関数を使うには、add_task(todos) のように関数名を記述して、実際に処理を実行させる「呼び出し」が必要です。これは料理のレシピ(定義)と、そのレシピを見て実際に料理する(呼び出し)の関係によく似ています。
2. メインループを書き換える
関数を定義したら、メインの while ループの中身は、これらの関数を呼び出すだけの非常にシンプルな形になります。
# while True: の中身 (リファクタリング後)
command = input("コマンドを選択してください (add, list, done, exit): ")
if command == "add":
add_task(todos) # add_task関数を呼び出す
elif command == "list":
list_tasks(todos) # list_tasks関数を呼び出す
elif command == "done":
complete_task(todos) # complete_task関数を呼び出す
elif command == "exit":
print("アプリを終了します。")
break
else:
print("無効なコマンドです。")
どうでしょうか? while ループの見た目が劇的にスッキリし、「どのコマンドが入力されたら、どの関数が呼ばれるのか」というプログラムの全体像が、一瞬で把握できるようになったと思いませんか?
まとめ
今回は、ToDoアプリのリファクタリングを通して、「関数」という強力な武器の使い方を学びました。
- def を使って、処理のまとまりに名前を付けて「部品化」する。
- メインの処理では、その部品(関数)を呼び出すだけにする。
- これにより、コードの可読性、再利用性、メンテナンス性が飛躍的に向上する。
良いプログラムとは、ただ動くだけでなく、人間にとって読みやすく、理解しやすいプログラムです。 あなたが書いたコードが長くなってきたら、それはチャンスです。どこを関数として切り出せるか、どうすればもっとシンプルに書けるかを考える習慣を身につけることが、あなたが「初心者」から「中級者」へとステップアップするための、最も重要な訓練なのです。
プログラミング学習に必須ツール!
記事で紹介したコードがよく分からなかったり、ご自身のコードについてもっと知りたい場合は、AIコード解説ツールが便利です。コードを貼り付けるだけで、AIが日本語で分かりやすく解説します。
AIコード解説ツールを使ってみる →