【Python関数入門】ToDoアプリをリファクタリング!整理されたコードの書き方 更新日: 2026年1月21日 私がプログラミング初心者の頃、最も苦しめられたもの。それは、自分が書いた「長すぎるコード」でした。 ある日、気合を入れて500行くらいのツールを作ったのですが、すべてを main 処理の中にベタ書きしていました。 「あ、ここ直したいな」と思っても、どこがその処理なのか探すのに5分かかり、修正したら別の場所が壊れ、最終的には「触るのが怖い」コードの塊になってしまいました。いわゆるスパゲッティコードです。 そんな私を救ってくれたのが、「関数 (function)」という概念でした。 処理を意味のある単位で「部品」として切り出すことで、コードは驚くほど読みやすく、修正しやすくなります。 今回は、前回作ったToDoアプリを題材に、ごちゃごちゃしたコードを美しく整理する「リファクタリング」の技術を、実体験を交えて解説します。 🔧 関数とは? なぜ必要なのか? 関数とは、一連の処理に名前を付けて、ひとまとめにした「部品」や「道具」のようなものです。 自分で関数を作るメリットは絶大です。 可読性の向上: 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 という名前の関数として定義します。 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("無効なコマンドです。") どうでしょうか? 私は初めてこれをやった時、「コードが英語の文章みたいに読める!」と感動しました。 「もしコマンドがaddなら、add_task(タスクを追加)せよ」。 このようにコードが「何をしているか」を語るようになるのが、良いコードの条件です。 まとめ 今回は、ToDoアプリのリファクタリングを通して、「関数」という強力な武器の使い方を学びました。 def を使って、処理のまとまりに名前を付けて「部品化」する。 メインの処理では、その部品(関数)を呼び出すだけにする。 「500行のスパゲッティコード」を書いた過去の自分に、この技術を教えてあげたいです。 ぜひあなたも、コードが長くなってきたら「関数にできないかな?」と考える癖をつけてみてください。それだけで、エンジニアとしてのレベルが一段階上がりますよ。 プログラミング学習に必須ツール! 記事で紹介したコードがよく分からなかったり、ご自身のコードについてもっと知りたい場合は、AIコード解説ツールが便利です。コードを貼り付けるだけで、AIが日本語で分かりやすく解説します。 AIコード解説ツールを使ってみる →