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 != ' ':breakwhile True:phone = input('请输入手机号码:')if phone != '' and phone != ' ':breakwhile True:email = input('请输入邮箱:')if email != '' and email != ' ':breakwhile True:address = input('请输入地址:')if address != '' and address != ' ':breakkeys_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('哦豁,此手机通讯录无数据!!!')continuename = 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('哦豁,此手机通讯录无数据!!!')continuename = 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 != ' ':breakwhile True:new_phone = input('请输入新的手机号码:')if new_phone != '' and new_phone != ' ':breakwhile True:new_email = input('请输入新的邮箱:')if new_email != '' and new_email != ' ':breakwhile 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 != ' ':breakwhile True:new_phone = input('请输入新的手机号码:')if new_phone != '' and new_phone != ' ':breakwhile True:new_email = input('请输入新的邮箱:')if new_email != '' and new_email != ' ':breakwhile 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('哦豁,此手机通讯录无数据!!!')continuename = 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 != ' ':breakwhile True:phone = input('请输入手机号码:')if phone != '' and phone != ' ':breakwhile True:email = input('请输入邮箱:')if email != '' and email != ' ':breakwhile True:address = input('请输入地址:')if address != '' and address != ' ':breakkeys_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('哦豁,此手机通讯录无数据!!!')continuename = 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('哦豁,此手机通讯录无数据!!!')continuename = 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 != ' ':breakwhile True:new_phone = input('请输入新的手机号码:')if new_phone != '' and new_phone != ' ':breakwhile True:new_email = input('请输入新的邮箱:')if new_email != '' and new_email != ' ':breakwhile 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 != ' ':breakwhile True:new_phone = input('请输入新的手机号码:')if new_phone != '' and new_phone != ' ':breakwhile True:new_email = input('请输入新的邮箱:')if new_email != '' and new_email != ' ':breakwhile 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('哦豁,此手机通讯录无数据!!!')continuename = 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143905.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

TikTok营销成功秘籍:ROI指标的黄金法则

在当今数字营销领域,TikTok已经崭露头角,成为了品牌和营销者们争相追逐的热门平台。 然而,要在TikTok上取得成功,不仅需要创意和内容,还需要精确的ROI(投资回报率)指标来衡量和优化你的营销策略…

Matlab论文插图绘制模板第116期—带时间刻度的图

之前的文章中,分享了Matlab带线标记的图: 带阴影标记的图: 带箭头标记的图: 带图形标记的图: 带Latex公式的图: 进一步,分享一下带时间刻度的图,先来看一下成品效果: 特别…

软考高级+系统架构设计师教程+第二版新版+电子版pdf

注意!!! 系统架构设计师出新版教程啦,2022年11月出版。所以今年下半年是新版第一次考试,不要再复习老版教程了,内容改动挺大的。 【内容简介】系统架构设计师教程(第2版)作为全国计…

CV经典任务(二)目标检测 |单目标,多目标 非极大值抑制等

文章目录 1 目标检测1.1 单目标检测1.2 多目标检测3.2.1 阶段一 单像素点采样目标检测3.2.2 阶段二 多像素点采样目标检测3.2.3 阶段三 RNN3.2.4 阶段四 一阶段的目标检测 Yolo/SSD 1 目标检测 目标检测的重要任务是 目标定位:目标检测的首要任务是确定图像中对象…

杭州亚运会虚实短视频《功成》,给数字人三维动画宣传片制作有何启发?

杭州亚运会功夫创意视频《功成》,由超写实数字人筱竹、武术演员张晋、青年运动员共同参演,通过数字人筱竹拜师功夫大师张晋的故事,将动静结合的中国功夫与亚运赛场上的体育竞技创意结合,以全新的数字人三维动画宣传片,…

网络安全(黑客技术)自学内容

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防…

【PickerView案例10-国旗选择界面02 Objective-C预言】

一、好了,我们继续来实现这个国旗选择界面: 1.它的界面里面,是不是很简单,就一个UIPickerView,就完事儿了 然后,显示的每一行内容呢, 1)一个文字Label 2)一个图片 那大家应该有意识,它返回的应该是一个View,对吧, 代理方法里面,有一个返回View的,viewForRow…

唤醒手腕 2023年 B 站课程 Golang 语言详细教程笔记(更新中)

0001、1000集GO语言Flag毒誓 唤醒手腕UP猪Pig目标花费1000集进行讲解Go语言视频学习教程(有趣的灵魂,适合小白,不适合巨佬),从2023年3月19日开始,将会一直每天更新,准备在2024年5月1日之前更新…

【VUE复习·8】v-if;v-show高级

总览 1.v-if 与其变种 v-else-if;v-else 2.v-show 3.v-if 与 v-show 的区别和应用场景 一、v-if 这样用(使用 data 或 函数 来驱动它) 1.v-if v-if 的用法很简单,它判断的是后面语句的 boolean 值,用来控制 DOM 元…

开源对手模拟工具:Network Flight Simulator

Network Flight Simulator 是一款轻量级实用程序,可生成恶意网络流量并帮助安全团队评估安全控制和网络可见性。 该工具执行测试来模拟 DNS 隧道、DGA 流量、对已知活动 C2 目的地的请求以及其他可疑流量模式。 安全行业内关于全面产品(例如 EDR、SI…

外汇天眼:外汇交易一周最佳外汇交易日!

外汇市场运行24小时,但并非每时每刻都适合交易。本文将为您介绍一周中最佳外汇交易日,以及哪些时间段最适合参与外汇交易。 首先,值得注意的是伦敦时段通常是外汇市场最繁忙的时段。然而,即便如此,一周中仍有特定的日…

蓝桥杯每日一题2023.9.27

4408. 李白打酒加强版 - AcWing题库 题目描述 题目分析 对于这题我们发现有三个变量,店,花,酒的数量,对于这种范围我们使用DP来进行分析。 dp[i][j][k]我们表示有i个店,j朵花,k单位酒的集合&#xff0c…

B树和B+树的介绍和对比,以及MySQL为何选择B+树

在计算机科学中,B树和B树是常用的数据结构,用于在大规模数据集上进行高效的插入、删除和查找操作。它们在数据库管理系统、文件系统等许多实际应用中发挥着重要作用。本文将深入介绍B树和B树的结构特点、实际应用方面以及它们的优缺点,并最后…

Unity3d中Scene场景2D模式下放大后UI元素后不显示的问题

如题:UI在game视图显示没有问题, 在Play状态下,在Sence视图查看UI对象的时候进行放大操作,然后UI就不显示了或者显示不全,缩小就恢复正常。这让我在Play模式下预览UI状态很麻烦。相关问题描述较少。 初步判定为摄像机…

力扣:111. 二叉树的最小深度(Python3)

题目: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 来源:力扣(LeetCode) 链接:力扣(LeetCod…

Spring Cloud Gateway实战WebFlux解析请求体及抛出指定错误代码和信息

概述 基于Spring Cloud开发微服务时,使用Spring Cloud原生自带的Gateway作为网关,所有请求都需要经过网关服务转发。 为了防止恶意请求刷取数据,对于业务请求需要进行拦截,故而可在网关服务增加拦截过滤器。基于此,有…

VM虚拟机连接NAT虚拟网络并上网的总结

关键字 VMware、NAT、VM虚拟机、ip route get、网关、私有云 设置 虚拟网络 VMware虚拟网络管理器中显示当前所有VMware的虚拟网络,根据显示,这里是"VMnet8"网络是NAT模式(寄主机只能存在一个NAT虚拟网络,也就是说&a…

制作PE启动盘

文章目录 ⭐️写在前面的话⭐️1、下载微PE2、格式化U盘3、安装PE到U盘4、下载镜像 ⭐️写在前面的话⭐️ 📒博客主页: 程序员好冰 🎉欢迎 【点赞👍 关注🔎 收藏⭐️ 留言📝】 📌本文由 程序员好…

通俗易懂了解大语言模型LLM发展历程

1.大语言模型研究路程 NLP的发展阶段大致可以分为以下几个阶段: 词向量词嵌入embedding句向量和全文向量理解上下文超大模型与模型统一 1.1词向量 将自然语言的词使用向量表示,一般构造词语字典,然后使用one-hot表示。   例如2个单词&…

【STM32】IAP升级01 bootloader实现以及APP配置(主要)

APP程序以及中断向量表的偏移设置 前言 通过之前的了解 之前的了解,我们知道实现IAP升级需要两个条件: 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始; 2.APP程序的中断向量表相应的移动,移动的偏移量为 x&#xff…