Python | 1 日 120 分 × 7 日アプリ学習:辞書型で作るユーザー管理アプリ(中級編)

Web APP Python
スポンサーリンク

3日目のゴール

3日目のテーマは
「辞書型を使って、ユーザー情報を“更新(Update)”し、削除(Delete)できるようになること」 です。

1日目:ユーザー1人を辞書で表現
2日目:複数ユーザー+メニューで Create / Read

今日はここに、

Update(更新)
Delete(削除)

を加えて、CRUD の4つを一通り体験します。


辞書の「更新」と「削除」をちゃんと理解する

更新は「同じキーに新しい値を上書きする」

辞書の更新は、とてもシンプルです。

user = {"name": "Taro", "age": 25}
user["age"] = 26
Python

この1行で、「age の値を 25 → 26 に変える」ことができます。

ここで大事なのは、

同じキーに代入すると「追加」ではなく「上書き」になる

という感覚です。

ユーザー管理アプリで言えば、

「同じユーザーIDのユーザーの中身を変える」
=「そのユーザーの辞書の中の値を上書きする」

ということです。

削除は「そのキーごと引き出しを取り外す」

辞書から要素を消すには、del を使います。

user = {"name": "Taro", "age": 25}
del user["age"]
Python

これで、"age" というキーごと消えます。

ユーザー一覧 users で言えば、

del users["u001"]
Python

と書けば、「u001 というIDのユーザーそのもの」が一覧から消えます。

ここでの重要ポイントは、

「更新」は中身だけ変える
「削除」はそのキーごと辞書から取り除く

という違いです。


Update:ユーザー情報を変更する処理を作る

どのユーザーを、どの項目だけ変えるか

まずは「ID を指定して、そのユーザーの情報を更新する」関数を作ります。

def update_user(users):
    print("=== ユーザー更新 ===")
    user_id = input("更新したいユーザーID: ").strip()

    if user_id not in users:
        print("そのIDのユーザーは存在しません。")
        return

    user = users[user_id]

    print(f"現在の名前: {user['name']}")
    new_name = input("新しい名前(変更しない場合は空欄のまま): ").strip()

    print(f"現在の年齢: {user['age']}")
    new_age_text = input("新しい年齢(変更しない場合は空欄のまま): ").strip()

    print(f"現在のメール: {user['email']}")
    new_email = input("新しいメールアドレス(変更しない場合は空欄のまま): ").strip()

    if new_name != "":
        user["name"] = new_name

    if new_age_text != "":
        if not new_age_text.isdigit():
            print("年齢は数字で入力してください。年齢の変更は行いません。")
        else:
            user["age"] = int(new_age_text)

    if new_email != "":
        user["email"] = new_email

    print("ユーザー情報を更新しました。")
Python

ここで深掘りしたいポイントは、いくつかあります。

最初に user_id not in users で存在チェックをしている
更新前の値を表示してから、新しい値を聞いている
空欄なら「その項目は変更しない」という仕様にしている
辞書 user の中の "name", "age", "email" を直接上書きしている

つまり、

「Update=既存の辞書の中の一部の値を上書きする処理」
を、ユーザーとの対話の形に落とし込んでいます。


Delete:ユーザーを削除する処理を作る

本当に消していいか、確認を挟む

削除はシンプルですが、「取り返しがつかない」操作です。
なので、確認を挟むのが現実的です。

def delete_user(users):
    print("=== ユーザー削除 ===")
    user_id = input("削除したいユーザーID: ").strip()

    if user_id not in users:
        print("そのIDのユーザーは存在しません。")
        return

    user = users[user_id]
    print("削除対象のユーザー:")
    print(f"ID: {user['id']}")
    print(f"名前: {user['name']}")
    print(f"年齢: {user['age']}")
    print(f"メール: {user['email']}")

    confirm = input("本当に削除しますか? (y/N): ").strip().lower()

    if confirm == "y":
        del users[user_id]
        print("ユーザーを削除しました。")
    else:
        print("削除をキャンセルしました。")
Python

ここでの重要ポイントは、

存在チェックをしてから削除している
削除前にユーザー情報を表示して確認させている
del users[user_id] で、そのユーザーを一覧から完全に取り除いている

ということです。

「Delete=辞書からキーごと取り除く」
という操作を、慎重に扱う形にしています。


3日目版メニュー:CRUD の C・R・U・D をそろえる

2日目のメニューに Update / Delete を足す

ここまで作った関数を、メニューから呼べるようにします。

def show_menu():
    print("==========")
    print("ユーザー管理アプリ(3日目)")
    print("1: ユーザーを登録する(Create)")
    print("2: ユーザー一覧を表示する(Read)")
    print("3: ユーザー情報を更新する(Update)")
    print("4: ユーザーを削除する(Delete)")
    print("0: 終了")
    print("==========")
Python

main はこうなります。

def main():
    users = {}

    while True:
        show_menu()
        choice = input("番号を選んでください: ").strip()

        if choice == "1":
            add_user(users)
        elif choice == "2":
            show_all_users(users)
        elif choice == "3":
            update_user(users)
        elif choice == "4":
            delete_user(users)
        elif choice == "0":
            print("アプリを終了します。")
            break
        else:
            print("不正な入力です。0〜4 のどれかを選んでください。")
Python

これで、
CRUD の4つがすべてメニューから操作できる状態
になります。


3日目の完成コードをまとめて眺める

「辞書型で作るユーザー管理アプリ」の骨格

def add_user(users):
    print("=== ユーザー登録 ===")
    user_id = input("ユーザーID: ").strip()

    if user_id in users:
        print("そのIDはすでに使われています。")
        return

    name = input("名前: ").strip()
    age_text = input("年齢: ").strip()
    email = input("メールアドレス: ").strip()

    if not age_text.isdigit():
        print("年齢は数字で入力してください。登録を中止します。")
        return

    age = int(age_text)

    user = {
        "id": user_id,
        "name": name,
        "age": age,
        "email": email
    }

    users[user_id] = user
    print("ユーザーを登録しました。")


def show_all_users(users):
    print("=== ユーザー一覧 ===")

    if not users:
        print("ユーザーはまだ登録されていません。")
        return

    for user_id, user in users.items():
        print(f"- ID: {user_id}")
        print(f"  名前: {user['name']}")
        print(f"  年齢: {user['age']}")
        print(f"  メール: {user['email']}")
        print("----------")


def update_user(users):
    print("=== ユーザー更新 ===")
    user_id = input("更新したいユーザーID: ").strip()

    if user_id not in users:
        print("そのIDのユーザーは存在しません。")
        return

    user = users[user_id]

    print(f"現在の名前: {user['name']}")
    new_name = input("新しい名前(変更しない場合は空欄のまま): ").strip()

    print(f"現在の年齢: {user['age']}")
    new_age_text = input("新しい年齢(変更しない場合は空欄のまま): ").strip()

    print(f"現在のメール: {user['email']}")
    new_email = input("新しいメールアドレス(変更しない場合は空欄のまま): ").strip()

    if new_name != "":
        user["name"] = new_name

    if new_age_text != "":
        if not new_age_text.isdigit():
            print("年齢は数字で入力してください。年齢の変更は行いません。")
        else:
            user["age"] = int(new_age_text)

    if new_email != "":
        user["email"] = new_email

    print("ユーザー情報を更新しました。")


def delete_user(users):
    print("=== ユーザー削除 ===")
    user_id = input("削除したいユーザーID: ").strip()

    if user_id not in users:
        print("そのIDのユーザーは存在しません。")
        return

    user = users[user_id]
    print("削除対象のユーザー:")
    print(f"ID: {user['id']}")
    print(f"名前: {user['name']}")
    print(f"年齢: {user['age']}")
    print(f"メール: {user['email']}")

    confirm = input("本当に削除しますか? (y/N): ").strip().lower()

    if confirm == "y":
        del users[user_id]
        print("ユーザーを削除しました。")
    else:
        print("削除をキャンセルしました。")


def show_menu():
    print("==========")
    print("ユーザー管理アプリ(3日目)")
    print("1: ユーザーを登録する(Create)")
    print("2: ユーザー一覧を表示する(Read)")
    print("3: ユーザー情報を更新する(Update)")
    print("4: ユーザーを削除する(Delete)")
    print("0: 終了")
    print("==========")


def main():
    users = {}

    while True:
        show_menu()
        choice = input("番号を選んでください: ").strip()

        if choice == "1":
            add_user(users)
        elif choice == "2":
            show_all_users(users)
        elif choice == "3":
            update_user(users)
        elif choice == "4":
            delete_user(users)
        elif choice == "0":
            print("アプリを終了します。")
            break
        else:
            print("不正な入力です。0〜4 のどれかを選んでください。")


main()
Python

関数ごとの役割を一文で説明してみる

自分の言葉で言えたら、もう「CRUD を理解している人」

add_user
「新しいユーザー情報を入力してもらい、users 辞書に追加する(Create)。」

show_all_users
「users 辞書の中身をすべて表示する(Read)。」

update_user
「指定したIDのユーザーを探し、その一部の項目だけを上書きする(Update)。」

delete_user
「指定したIDのユーザーを確認し、OKなら users 辞書から削除する(Delete)。」

main
「users 辞書を持ちながら、メニューで CRUD の各操作を呼び分ける。」

ここまで言えれば、
「辞書型で CRUD を実装する」という中級の山を、しっかり越えています。


3日目のまとめ:今日つかんでほしい感覚

今日の本質は、これです。

更新は「同じキーに新しい値を代入する」だけで実現できる。
削除は「del 辞書[キー]」で、そのキーごと取り除ける。
Update は「一部だけ上書き」、Delete は「丸ごと消す」。
CRUD の4つは、辞書型と相性がとても良い。
メニューと関数を組み合わせると、「小さな本物のアプリ」になる。

4日目以降は、
このユーザー管理アプリに「検索」「ソート」「保存」などを足していきます。
今日の CRUD の感覚は、この先ずっと使う“基礎体力”になるので、
コードを眺めながら、自分の言葉で説明できるところまで何度か噛みしめてみてください。

タイトルとURLをコピーしました