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

Web APP Python
スポンサーリンク

2日目のゴール

2日目のテーマは
「辞書型で“複数ユーザー”を扱い、メニューから操作できるようになること」 です。

1日目でやったのは「1人だけ登録してすぐ表示」でした。
今日はそこから一歩進んで、

複数ユーザーを辞書で管理する
メニューで「登録」「一覧表示」を選べるようにする
CRUD のうち C(Create)と R(Read)を“アプリの形”にする

ここを狙います。


辞書で「複数ユーザー」を扱う復習

users 辞書の構造をもう一度言葉で確認する

2日目のスタート地点として、
まずはこの形を頭に思い浮かべてください。

users = {
    "u001": {
        "id": "u001",
        "name": "Taro",
        "age": 25,
        "email": "taro@example.com"
    },
    "u002": {
        "id": "u002",
        "name": "Hanako",
        "age": 30,
        "email": "hanako@example.com"
    }
}
Python

これを日本語で説明すると、

users は「ユーザー一覧」を表す大きな辞書
キーはユーザーID(”u001″ など)
値は「そのユーザーの情報が入った辞書」

という二段構造です。

ここで大事なのは、
「ユーザーIDで一発でユーザーを取り出せる」
という設計になっていることです。


Create を関数として切り出す

「ユーザーを1人登録する処理」に名前をつける

1日目は main の中に全部書いていましたが、
2日目では「役割ごとに関数に分ける」ことを意識します。

まずは「ユーザーを1人登録する」関数です。

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("ユーザーを登録しました。")
Python

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

ユーザーIDがすでに存在しないかを最初にチェックしている
年齢が数字かどうかを isdigit() で確認している
users は「ユーザー一覧の辞書」で、そこに users[user_id] = user で追加している

つまり、

「Create=辞書に新しいキーと値を追加する処理」
を、関数として名前付きで切り出した形です。


Read を「一覧表示」として形にする

全ユーザーをぐるっと回して表示する

次に、「登録されているユーザーを一覧表示する」関数を作ります。

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("----------")
Python

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

for user_id, user in users.items():
「キー(ユーザーID)と値(ユーザー辞書)」を同時に取り出している

ということです。

users.items() は、
「(キー, 値) のペア」を順番に返してくれる仕組みです。

これで、

ユーザーIDを表示しつつ
そのユーザーの中身(name, age, email)も表示する

という「一覧表示」が簡単に書けます。


メニューで操作を選べるようにする

main で「アプリの流れ」を作る

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

def show_menu():
    print("==========")
    print("ユーザー管理アプリ(2日目)")
    print("1: ユーザーを登録する")
    print("2: ユーザー一覧を表示する")
    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 == "0":
            print("アプリを終了します。")
            break
        else:
            print("不正な入力です。0, 1, 2 のどれかを選んでください。")


main()
Python

ここでの深掘りポイントは、

users 辞書を main の中で一度だけ作っている
add_user と show_all_users に users を渡している
while True で「メニューを繰り返し表示する」ループを作っている

という構造です。

つまり、

main は「アプリ全体の流れ」を担当し、
add_user は「登録」、show_all_users は「一覧表示」を担当する、
という役割分担になっています。


2日目の完成コードをまとめて見る

「複数ユーザー+メニュー」の最初の形

ここまでのコードを、ひとつにまとめます。

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 show_menu():
    print("==========")
    print("ユーザー管理アプリ(2日目)")
    print("1: ユーザーを登録する")
    print("2: ユーザー一覧を表示する")
    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 == "0":
            print("アプリを終了します。")
            break
        else:
            print("不正な入力です。0, 1, 2 のどれかを選んでください。")


main()
Python

関数ごとの役割を日本語で言い切る

自分の言葉で説明できたら、もう“理解した側”

add_user
「ユーザーID・名前・年齢・メールを入力してもらい、
ユーザー辞書を作って users 辞書に登録する。
ID の重複や年齢の入力ミスもチェックする。」

show_all_users
「users 辞書の中身をぐるっと回して、
ユーザーIDとそのユーザー情報を一覧表示する。」

show_menu
「アプリのメニュー(登録・一覧・終了)を表示する。」

main
「users 辞書を用意し、メニューを繰り返し表示しながら、
選ばれた番号に応じて add_user や show_all_users を呼び出す。」

ここまで自分の言葉で説明できれば、
「辞書型で作るユーザー管理アプリの“骨格”」
はもうつかめています。


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

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

ユーザー一覧は「ユーザーID → ユーザー辞書」の辞書で持つ。
Create は「users[user_id] = user」で新しいユーザーを追加すること。
Read(一覧)は「for user_id, user in users.items():」で全部回して表示すること。
メニューと while ループを使うと、「アプリとしての流れ」が生まれる。
辞書(データ)と関数(操作)を分けて考えると、コードの見通しが一気によくなる。

3日目からは、
この土台の上に「Update(更新)」と「Delete(削除)」を乗せていきます。
いよいよ CRUD の “UD” に踏み込んでいくので、
今日の「複数ユーザー+メニュー」の感覚はしっかり握っておいてください。

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