ログアウト中 ログイン

学習パッケージを選択

【Python】Todoアプリ(メモリ版)作成講座 第2章2.1節「Todo操作関数の作成」




現在の見出し:2.1節:Todo操作関数の作成

見出し一覧

  • 2.1節:Todo操作関数の作成
  • - def文による基本操作関数の実装
  • - 引数とreturn文による関数連携機能の実装
  • - while文とif-elif-else文による永続実行機能の実装

【PR】『Python』を学べる企業・個人向けのプログラミングコース

def文による基本操作関数の実装

前のセクションで作成したコードを基盤として、Todo管理システムの各機能を独立した関数として実装します。現在のコードは一つの連続したプログラムプログラムはコンピュータに対して何をすべきかを指示する一連の命令です。として動作していますが、機能が追加されるにつれてコードが長くなり、保守性や再利用性に課題が生じるため、def文を使用した関数化が必要です。

関数名 担当機能 主な処理内容 戻り値
add_todo() Todo追加 ユーザー入力を受け取りリストに追加 更新されたtodosリスト
show_todos() 一覧表示 Todo項目を番号付きで表示 元のtodosリスト
search_todos() 検索機能 キーワードに一致する項目を表示 元のtodosリスト
delete_todo() 削除機能 指定番号の項目をリストから削除 更新されたtodosリスト

関数化のメリットとして、各機能(追加・表示・検索・削除)が独立した関数として分離されることになり、どの部分がどの処理を担当しているかが明確になります。次に、同じ処理を複数回実行したい場合に関数名を呼び出すだけで済むため、コードの重複を避けることができます。

さらに、一つの機能に問題が発生した場合や改良が必要な場合、該当する関数のみを修正すれば良いため、他の機能に影響を与えることなく安全に変更できます。各関数は「todosリストを受け取る→処理を実行する→結果のtodosリストを返す」という統一されたルールに従って設計することで、関数間でのデータの受け渡しが整理され、予期しないエラーを防ぐことができます。

# コード
def add_todo(todos):
    """新しいTodoを追加する関数"""
    content = input("Todo内容を入力: ")
    todos.append(content)
    print(f"'{content}' を追加しました")
    return todos

def show_todos(todos):
    """Todo一覧を表示する関数"""
    print("\n=== Todo一覧 ===")
    if len(todos) == 0:
        print("Todoはありません")
    else:
        for i, todo in enumerate(todos, 1):
            print(f"{i}. {todo}")
        print(f"全{len(todos)}件のTodo")
    return todos

def search_todos(todos):
    """Todoを検索する関数"""
    keyword = input("検索キーワードを入力: ")
    found = False
    
    print(f"\n'{keyword}' を含むTodo:")
    for i, todo in enumerate(todos, 1):
        if keyword in todo:
            print(f"{i}. {todo}")
            found = True
    
    if not found:
        print("該当するTodoが見つかりませんでした")
    return todos

def delete_todo(todos):
    """Todoを削除する関数"""
    if len(todos) == 0:
        print("削除するTodoがありません")
        return todos
    
    print("\n=== Todo一覧 ===")
    for i, todo in enumerate(todos, 1):
        print(f"{i}. {todo}")
    
    number = int(input("削除する番号を入力: "))
    index = number - 1
    
    if 0 <= index < len(todos):
        deleted = todos.pop(index)
        print(f"'{deleted}' を削除しました")
    else:
        print("無効な番号です")
    
    return todos

# 関数のテスト実行
todos = ["買い物に行く", "宿題をする", "プログラムの勉強"]

print("=== add_todo関数のテスト ===")
todos = add_todo(todos)

print("\n=== show_todos関数のテスト ===")
todos = show_todos(todos)

print("\n=== search_todos関数のテスト ===")
todos = search_todos(todos)

print("\n=== delete_todo関数のテスト ===")
todos = delete_todo(todos)

print("\n=== 最終状態の確認 ===")
todos = show_todos(todos)
# 実行結果
=== add_todo関数のテスト ===
Todo内容を入力: 本を読む
'本を読む' を追加しました

=== show_todos関数のテスト ===

=== Todo一覧 ===
1. 買い物に行く
2. 宿題をする
3. プログラムの勉強
4. 本を読む
全4件のTodo

=== search_todos関数のテスト ===
検索キーワードを入力: 勉強

'勉強' を含むTodo:
2. 宿題をする
3. プログラムの勉強

=== delete_todo関数のテスト ===

=== Todo一覧 ===
1. 買い物に行く
2. 宿題をする
3. プログラムの勉強
4. 本を読む
削除する番号を入力: 1
'買い物に行く' を削除しました

=== 最終状態の確認 ===

=== Todo一覧 ===
1. 宿題をする
2. プログラムの勉強
3. 本を読む
全3件のTodo
行数 種別 コード 解説
2行目 新規 def add_todo(todos): Todo追加機能をdef文で関数として定義し、引数引数はプログラミングで関数やメソッドに渡される値や変数で、関数の動作を柔軟に制御し、コードの再利用性を高めます。でtodosリストを受け取ります
3行目 新規 """新しいTodoを追加する関数""" docstringで関数の機能を説明し、コードの可読性を向上させます
4行目 新規 content = input("Todo内容を入力: ") add_todo関数内でユーザーからTodo内容を入力受付します
5行目 新規 todos.append(content) add_todo関数内で入力されたTodoを引数のtodosリストに追加します
6行目 新規 print(f"'{content}' を追加しました") add_todo関数内で追加完了メッセージを表示します
7行目 新規 return todos add_todo関数から更新されたtodosリストを戻り値として返します
9行目 新規 def show_todos(todos): Todo表示機能をdef文で関数として定義し、引数でtodosリストを受け取ります
10行目 新規 """Todo一覧を表示する関数""" docstringでshow_todos関数の機能を説明します
11行目 新規 print("\n=== Todo一覧 ===") show_todos関数内でTodo一覧のヘッダーメッセージを表示します
12行目 新規 if len(todos) == 0: show_todos関数内でtodosリストが空の場合の条件判定を行います
13行目 新規 print("Todoはありません") show_todos関数内でTodoが存在しない場合のメッセージを表示します
14行目 新規 else: show_todos関数内でTodoが存在する場合の条件分岐条件分岐はプログラム内で指定した条件によって処理の分岐を行う制御構造です。です
15行目 新規 for i, todo in enumerate(todos, 1): show_todos関数内でTodo項目を番号付きで順次取得するループループは一連の命令を繰り返し実行する構造です。処理を開始します
16行目 新規 print(f"{i}. {todo}") show_todos関数内でTodo項目を番号付きで表示します
17行目 新規 print(f"全{len(todos)}件のTodo") show_todos関数内でTodo項目数を表示します
18行目 新規 return todos show_todos関数から元のtodosリストを戻り値として返します
20行目 新規 def search_todos(todos): Todo検索機能をdef文で関数として定義し、引数でtodosリストを受け取ります
21行目 新規 """Todoを検索する関数""" docstringでsearch_todos関数の機能を説明します
22行目 新規 keyword = input("検索キーワードを入力: ") search_todos関数内でユーザーから検索キーワードを入力受付します
23行目 新規 found = False search_todos関数内で検索結果が見つかったかを追跡するフラグ変数変数はデータを一時的に記憶しておく場所です。を初期化します
25行目 新規 print(f"\n'{keyword}' を含むTodo:") search_todos関数内で検索結果のヘッダーメッセージを表示します
26行目 新規 for i, todo in enumerate(todos, 1): search_todos関数内でTodo項目を番号付きで順次取得するループ処理を開始します
27行目 新規 if keyword in todo: search_todos関数内でin演算子演算子は数値や文字列などのデータを扱う際に使用される記号や記述方法です。によるキーワード一致判定を行います
28行目 新規 print(f"{i}. {todo}") search_todos関数内で該当するTodo項目を番号付きで表示します
29行目 新規 found = True search_todos関数内で検索結果が見つかったことをフラグ変数で記録します
31行目 新規 if not found: search_todos関数内で検索結果が見つからなかった場合の条件判定を行います
32行目 新規 print("該当するTodoが見つかりませんでした") search_todos関数内で検索結果が見つからない場合のメッセージを表示します
33行目 新規 return todos search_todos関数から元のtodosリストを戻り値として返します
35行目 新規 def delete_todo(todos): Todo削除機能をdef文で関数として定義し、引数でtodosリストを受け取ります
36行目 新規 """Todoを削除する関数""" docstringでdelete_todo関数の機能を説明します
37行目 新規 if len(todos) == 0: delete_todo関数内でtodosリストが空の場合の条件判定を行います
38行目 新規 print("削除するTodoがありません") delete_todo関数内でTodoが存在しない場合のメッセージを表示します
39行目 新規 return todos delete_todo関数から元のtodosリストを早期返却します
41行目 新規 print("\n=== Todo一覧 ===") delete_todo関数内で削除対象選択用のヘッダーメッセージを表示します
42行目 新規 for i, todo in enumerate(todos, 1): delete_todo関数内でTodo項目を番号付きで順次取得するループ処理を開始します
43行目 新規 print(f"{i}. {todo}") delete_todo関数内でTodo項目を番号付きで表示します
45行目 新規 number = int(input("削除する番号を入力: ")) delete_todo関数内でユーザーから削除番号を数値として入力受付します
46行目 新規 index = number - 1 delete_todo関数内で番号をリストインデックスに変換します
48行目 新規 if 0 <= index < len(todos): delete_todo関数内でインデックスが有効範囲内かを判定します
49行目 新規 deleted = todos.pop(index) delete_todo関数内でpop()メソッドメソッドは特定の処理をまとめたプログラムの塊です。による要素削除を実行します
50行目 新規 print(f"'{deleted}' を削除しました") delete_todo関数内で削除されたTodo内容を確認表示します
51行目 新規 else: delete_todo関数内で無効な番号が入力された場合の条件分岐です
52行目 新規 print("無効な番号です") delete_todo関数内で無効な番号が入力された場合のエラーメッセージを表示します
54行目 新規 return todos delete_todo関数から更新されたtodosリストを戻り値として返します
57行目 新規 todos = ["買い物に行く", "宿題をする", "プログラムの勉強"] 関数テスト用のサンプルTodoデータを初期化します
59行目 新規 print("=== add_todo関数のテスト ===") add_todo関数のテスト実行を示すヘッダーメッセージを表示します
60行目 新規 todos = add_todo(todos) add_todo関数を呼び出し戻り値でtodosリストを更新します
62行目 新規 print("\n=== show_todos関数のテスト ===") show_todos関数のテスト実行を示すヘッダーメッセージを表示します
63行目 新規 todos = show_todos(todos) show_todos関数を呼び出し戻り値でtodosリストを更新します
65行目 新規 print("\n=== search_todos関数のテスト ===") search_todos関数のテスト実行を示すヘッダーメッセージを表示します
66行目 新規 todos = search_todos(todos) search_todos関数を呼び出し戻り値でtodosリストを更新します
68行目 新規 print("\n=== delete_todo関数のテスト ===") delete_todo関数のテスト実行を示すヘッダーメッセージを表示します
69行目 新規 todos = delete_todo(todos) delete_todo関数を呼び出し戻り値でtodosリストを更新します
71行目 新規 print("\n=== 最終状態の確認 ===") 全関数テスト後の最終状態確認を示すヘッダーメッセージを表示します
72行目 新規 todos = show_todos(todos) 最終状態確認のためshow_todos関数を呼び出します
引数とreturn文による関数連携機能の実装

第2章2.1節「引数とreturn文による関数連携機能の実装」の続きを見る


すべてのカリキュラムを無料登録で学ぶ

プログラミング・マーケティング・AI活用方法を
今すぐ無料登録すると、全てのコンテンツが視聴可能になります。