Python 用嵌套字典实现手机通讯录(详解版)

一、先搭建一个框架。有条理地把要实现的功能罗列出来!

# 定义一个字典用于暂存信息(程序结束,数据删除)
contacts = dict()

input_buf = '请输入序号:'

while True:

    # 打印菜单界面
    print(f''' {"="*8}手机通讯录{"="*8}
1.添加联系人\t\t2.查看联系人
3.删除联系人\t\t4.修改联系人
5.查找联系人\t\t0.退出''')

    # 选择菜单
    choice_menu = input(input_buf)
    input_buf = '请输入序号:'

    # 防止输入非范围内的字符
    if choice_menu not in tuple('012345'):
        input_buf = '请重新输入序号:'
        continue

    # 1.添加联系人   ============================
    elif choice_menu == '1':
        print(1)

    # 2.查看联系人   ============================
    elif choice_menu == '2':
        print(2)

    # 3.删除联系人   ============================
    elif choice_menu == '3':
        print(3)

    # 4.修改联系人   ============================
    elif choice_menu == '4':
        print(4)

    # 5.查找联系人   ============================
    elif choice_menu == '5':
        print(5)

    # 0.退出  ============================
    else:
        print(f'{"="*6}已退出手机通讯录{"="*6}')
        break

运行结果:

 ========手机通讯录========
1.添加联系人		2.查看联系人
3.删除联系人		4.修改联系人
5.查找联系人		0.退出
请输入序号:1
1
 ========手机通讯录========
1.添加联系人		2.查看联系人
3.删除联系人		4.修改联系人
5.查找联系人		0.退出
请输入序号:9
 ========手机通讯录========
1.添加联系人		2.查看联系人
3.删除联系人		4.修改联系人
5.查找联系人		0.退出
请重新输入序号:a
 ========手机通讯录========
1.添加联系人		2.查看联系人
3.删除联系人		4.修改联系人
5.查找联系人		0.退出
请重新输入序号:0
======已退出手机通讯录======

二、有序实现具体功能。根据项目要求编写代码

1.添加联系人

# 1.添加联系人   ============================
    elif choice_menu == '1':
        print(f' {"=" * 8}添加联系人{"=" * 8}')

        # 防止输入空字符和首字符空格' '(无法防止多个空格输入)
        while True:
            name = input('请输入名字:')
            if name != '' and name != ' ':
                break
        while True:
            phone = input('请输入手机号码:')
            if phone != '' and phone != ' ':
                break
        while True:
            email = input('请输入邮箱:')
            if email != '' and email != ' ':
                break
        while True:
            address = input('请输入地址:')
            if address != '' and address != ' ':
                break

        keys_name += 1
        # 数据写入字典
        contacts[keys_name] = {'name': name, 'phone': phone, 'email': email, 'address': address}
        # print(contacts)
        print('已保存成功')

2.查看联系人

# 2.查看联系人   ============================
    elif choice_menu == '2':
        print(f' {"=" * 8}查看联系人{"=" * 8}')

        # 是否为空字典
        if contacts == dict():
            print('哦豁,此手机通讯录无数据!!!')
            continue

        # 遍历打印通讯录
        for i in contacts.values():
            # print(i)
            print(f"姓名:{i['name']}\t手机号码:{i['phone']}\t邮箱:{i['email']}\t住址:{i['address']}")

3.删除联系人

# 3.删除联系人   ============================
    elif choice_menu == '3':
        print(f' {"=" * 8}删除联系人{"=" * 8}')

        # 是否为空字典
        if contacts == dict():
            print('哦豁,此手机通讯录无数据!!!')
            continue

        name = input('请输入需要删除的名字:')

        name_count = 0              # 记录重名的次数
        keys_buf = list()           # 存储重名的键值,方便字典索引

        # 遍历查找此人
        for i in contacts:
            if contacts[i]['name'] == name:
                
                name_count += 1             # 重名计数
                keys_buf.append(i)          # 把找到名字的字典键值追加到列表中
                
                print(f"{name_count}.姓名:{contacts[i]['name']}\t"
                      f"手机号码:{contacts[i]['phone']}\t"
                      f"邮箱:{contacts[i]['email']}\t"
                      f"住址:{contacts[i]['address']}")

        # 多个重名选择删除
        if name_count > 1:
            name_choice = int(input('请选择需要删除名字的序号:'))
            for i in range(name_count):
                if (name_choice-1) == i:
                    contacts.pop(keys_buf[i])       # 删除字典元素
                    print('已删除成功!')
                    
        # 只有一个删除
        elif name_count == 1:
            contacts.pop(keys_buf[0])           # 删除字典元素
            print('已删除成功!')
            
        # 找不到此人
        else:
            print('此人不在通讯录,请确认输入是否有误!')

4.修改联系人

# 4.修改联系人   ============================
    elif choice_menu == '4':
        print(f' {"=" * 8}修改联系人{"=" * 8}')

        # 是否为空字典
        if contacts == dict():
            print('哦豁,此手机通讯录无数据!!!')
            continue

        name = input('请输入需要修改的名字:')

        name_count = 0          # 记录重名的次数
        keys_buf = list()       # 存储重名的键值,方便字典索引

        # 遍历查找此人
        for i in contacts:
            if contacts[i]['name'] == name:
                name_count += 1         # 重名计数
                keys_buf.append(i)      # 把找到名字的字典键值追加到列表中

                print(f"{name_count}.姓名:{contacts[i]['name']}\t"
                      f"手机号码:{contacts[i]['phone']}\t"
                      f"邮箱:{contacts[i]['email']}\t"
                      f"住址:{contacts[i]['address']}")

        # 多个重名选择修改
        if name_count > 1:
            name_choice = int(input('请选择需要修改名字的序号:'))
            
            for i in range(name_count):
                if (name_choice - 1) == i:

                    # 防止输入空字符和首字符空格' '(无法防止多个空格输入)
                    while True:
                        new_name = input('请输入新的名字:')
                        if new_name != '' and new_name != ' ':
                            break
                    while True:
                        new_phone = input('请输入新的手机号码:')
                        if new_phone != '' and new_phone != ' ':
                            break
                    while True:
                        new_email = input('请输入新的邮箱:')
                        if new_email != '' and new_email != ' ':
                            break
                    while True:
                        new_address = input('请输入新的地址:')
                        if new_address != '' and new_address != ' ':
                            break

                    # 新数据覆盖字典
                    contacts[keys_buf[i]] = {'name': new_name, 'phone': new_phone,
                                             'email': new_email, 'address': new_address}
                    # print(contacts)
                    print('已修改成功')

        # 只有一个删除
        elif name_count == 1:

            # 防止输入空字符和首字符空格' '(无法防止多个空格输入)
            while True:
                new_name = input('请输入新的名字:')
                if new_name != '' and new_name != ' ':
                    break
            while True:
                new_phone = input('请输入新的手机号码:')
                if new_phone != '' and new_phone != ' ':
                    break
            while True:
                new_email = input('请输入新的邮箱:')
                if new_email != '' and new_email != ' ':
                    break
            while True:
                new_address = input('请输入新的地址:')
                if new_address != '' and new_address != ' ':
                    break

            # 数据覆盖字典
            contacts[keys_buf[0]] = {'name': new_name, 'phone': new_phone,
                                     'email': new_email, 'address': new_address}
            # print(contacts)
            print('已修改成功')

        # 找不到此人
        else:
            print('此人不在通讯录,请确认输入是否有误!')

5.查找联系人

# 5.查找联系人   ============================
    elif choice_menu == '5':
        print(f' {"=" * 8}查找联系人{"=" * 8}')

        # 是否为空字典
        if contacts == dict():
            print('哦豁,此手机通讯录无数据!!!')
            continue

        name = input('请输入需要查找的名字:')

        name_count = 0          # 记录重名的次数

        # 遍历查找此人
        for i in contacts:
            if contacts[i]['name'] == name:
                name_count += 1         # 重名计数

                print(f"{name_count}.姓名:{contacts[i]['name']}\t"
                      f"手机号码:{contacts[i]['phone']}\t"
                      f"邮箱:{contacts[i]['email']}\t"
                      f"住址:{contacts[i]['address']}")

        # 找不到此人
        if name_count == 0:
            print('此人不在通讯录,请确认输入是否有误!')

三、代码汇总。实现完整的功能

"""
    用字典模拟手机通讯录
    
知识点:
    1、嵌套字典使用
    2、字典增删改查
    3、嵌套循环/条件语句/跳转语句
    4、数据类型转换/元素索引

改善与不足:
    1、代码块很臃肿,有很多重复的代码,如果使用函数就能避免
    2、在多个重名选择输入序号时,没有做限制
    3、程序结束,数据删除,无法保存

"""


# 定义一个字典用于暂存信息(程序结束,数据删除)
contacts = dict()

input_buf = '请输入序号:'
keys_name = 0                   # 字典键值命名

# 功能实现  ===========================================================
while True:

    # 打印菜单界面
    print(f''' {"=" * 8}手机通讯录{"=" * 8}
1.添加联系人\t\t2.查看联系人
3.删除联系人\t\t4.修改联系人
5.查找联系人\t\t0.退出''')

    # 选择菜单
    choice_menu = input(input_buf)
    input_buf = '请输入序号:'

    # 防止输入非范围内的字符
    if choice_menu not in tuple('012345'):
        input_buf = '请重新输入序号:'
        continue

    # 1.添加联系人   ====================================================
    elif choice_menu == '1':
        print(f' {"=" * 8}添加联系人{"=" * 8}')

        # 防止输入空字符和首字符空格' '(无法防止多个空格输入)
        while True:
            name = input('请输入名字:')
            if name != '' and name != ' ':
                break
        while True:
            phone = input('请输入手机号码:')
            if phone != '' and phone != ' ':
                break
        while True:
            email = input('请输入邮箱:')
            if email != '' and email != ' ':
                break
        while True:
            address = input('请输入地址:')
            if address != '' and address != ' ':
                break

        keys_name += 1
        # 数据写入字典
        contacts[keys_name] = {'name': name, 'phone': phone, 'email': email, 'address': address}
        # print(contacts)
        print('已保存成功')

    # 2.查看联系人   ====================================================
    elif choice_menu == '2':
        print(f' {"=" * 8}查看联系人{"=" * 8}')

        # 是否为空字典
        if contacts == dict():
            print('哦豁,此手机通讯录无数据!!!')
            continue

        # 遍历打印通讯录
        for i in contacts.values():
            # print(i)
            print(f"姓名:{i['name']}\t手机号码:{i['phone']}\t邮箱:{i['email']}\t住址:{i['address']}")

    # 3.删除联系人   ====================================================
    elif choice_menu == '3':
        print(f' {"=" * 8}删除联系人{"=" * 8}')

        # 是否为空字典
        if contacts == dict():
            print('哦豁,此手机通讯录无数据!!!')
            continue

        name = input('请输入需要删除的名字:')

        name_count = 0  # 记录重名的次数
        keys_buf = list()  # 存储重名的键值,方便字典索引

        # 遍历查找此人
        for i in contacts:
            if contacts[i]['name'] == name:
                name_count += 1  # 重名计数
                keys_buf.append(i)  # 把找到名字的字典键值追加到列表中

                print(f"{name_count}.姓名:{contacts[i]['name']}\t"
                      f"手机号码:{contacts[i]['phone']}\t"
                      f"邮箱:{contacts[i]['email']}\t"
                      f"住址:{contacts[i]['address']}")

        # 多个重名选择删除
        if name_count > 1:
            name_choice = int(input('请选择需要删除名字的序号:'))
            for i in range(name_count):
                if (name_choice - 1) == i:
                    contacts.pop(keys_buf[i])  # 删除字典元素
                    print('已删除成功!')

        # 只有一个删除
        elif name_count == 1:
            contacts.pop(keys_buf[0])  # 删除字典元素
            print('已删除成功!')

        # 找不到此人
        else:
            print('此人不在通讯录,请确认输入是否有误!')

    # 4.修改联系人   ====================================================
    elif choice_menu == '4':
        print(f' {"=" * 8}修改联系人{"=" * 8}')

        # 是否为空字典
        if contacts == dict():
            print('哦豁,此手机通讯录无数据!!!')
            continue

        name = input('请输入需要修改的名字:')

        name_count = 0          # 记录重名的次数
        keys_buf = list()       # 存储重名的键值,方便字典索引

        # 遍历查找此人
        for i in contacts:
            if contacts[i]['name'] == name:
                name_count += 1         # 重名计数
                keys_buf.append(i)      # 把找到名字的字典键值追加到列表中

                print(f"{name_count}.姓名:{contacts[i]['name']}\t"
                      f"手机号码:{contacts[i]['phone']}\t"
                      f"邮箱:{contacts[i]['email']}\t"
                      f"住址:{contacts[i]['address']}")

        # 多个重名选择修改
        if name_count > 1:
            name_choice = int(input('请选择需要修改名字的序号:'))

            for i in range(name_count):
                if (name_choice - 1) == i:

                    # 防止输入空字符和首字符空格' '(无法防止多个空格输入)
                    while True:
                        new_name = input('请输入新的名字:')
                        if new_name != '' and new_name != ' ':
                            break
                    while True:
                        new_phone = input('请输入新的手机号码:')
                        if new_phone != '' and new_phone != ' ':
                            break
                    while True:
                        new_email = input('请输入新的邮箱:')
                        if new_email != '' and new_email != ' ':
                            break
                    while True:
                        new_address = input('请输入新的地址:')
                        if new_address != '' and new_address != ' ':
                            break

                    # 新数据覆盖字典
                    contacts[keys_buf[i]] = {'name': new_name, 'phone': new_phone,
                                             'email': new_email, 'address': new_address}
                    # print(contacts)
                    print('已修改成功')

        # 只有一个删除
        elif name_count == 1:

            # 防止输入空字符和首字符空格' '(无法防止多个空格输入)
            while True:
                new_name = input('请输入新的名字:')
                if new_name != '' and new_name != ' ':
                    break
            while True:
                new_phone = input('请输入新的手机号码:')
                if new_phone != '' and new_phone != ' ':
                    break
            while True:
                new_email = input('请输入新的邮箱:')
                if new_email != '' and new_email != ' ':
                    break
            while True:
                new_address = input('请输入新的地址:')
                if new_address != '' and new_address != ' ':
                    break

            # 数据覆盖字典
            contacts[keys_buf[0]] = {'name': new_name, 'phone': new_phone,
                                     'email': new_email, 'address': new_address}
            # print(contacts)
            print('已修改成功')

        # 找不到此人
        else:
            print('此人不在通讯录,请确认输入是否有误!')

    # 5.查找联系人   ====================================================
    elif choice_menu == '5':
        print(f' {"=" * 8}查找联系人{"=" * 8}')

        # 是否为空字典
        if contacts == dict():
            print('哦豁,此手机通讯录无数据!!!')
            continue

        name = input('请输入需要查找的名字:')

        name_count = 0          # 记录重名的次数

        # 遍历查找此人
        for i in contacts:
            if contacts[i]['name'] == name:
                name_count += 1         # 重名计数

                print(f"{name_count}.姓名:{contacts[i]['name']}\t"
                      f"手机号码:{contacts[i]['phone']}\t"
                      f"邮箱:{contacts[i]['email']}\t"
                      f"住址:{contacts[i]['address']}")

        # 找不到此人
        if name_count == 0:
            print('此人不在通讯录,请确认输入是否有误!')

    # 0.退出  ==========================================================
    else:
        print(f'{"=" * 6}已退出手机通讯录{"=" * 6}')
        break


运行结果:

 ========手机通讯录========
1.添加联系人		2.查看联系人
3.删除联系人		4.修改联系人
5.查找联系人		0.退出
请输入序号:5
 ========查找联系人========
哦豁,此手机通讯录无数据!!!
 ========手机通讯录========
1.添加联系人		2.查看联系人
3.删除联系人		4.修改联系人
5.查找联系人		0.退出
请输入序号:1
 ========添加联系人========
请输入名字:周华
请输入手机号码:1008611
请输入邮箱:123.com
请输入地址:广州
已保存成功
 ========手机通讯录========
1.添加联系人		2.查看联系人
3.删除联系人		4.修改联系人
5.查找联系人		0.退出
请输入序号:2
 ========查看联系人========
姓名:周华	手机号码:1008611	邮箱:123.com	住址:广州

作者:周华

创作日期:2023/9/27

你可能感兴趣的:(Python,入门案例,python)