現在の見出し: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関数を呼び出します | 
- def文:Pythonマスター講座 第6章6.2節Pythonマスター講座第6章 6.2節では、Pythonの関数に関する内容を学べますで解説
- return文:Pythonマスター講座 第6章6.2節で解説
- docstring:Pythonマスター講座 第6章6.2節で解説
 
                 
                 
                         
              

















