Python实战:打造高效通讯录管理系统
📋 编程基础第一期《8-30》–通讯录管理系统
📑 项目介绍
在信息化时代,高效管理个人或团队联系人信息变得尤为重要。本文将带您实现一个基于Python的通讯录管理系统,该系统采用字典数据结构和JSON文件存储,实现了联系人的增删改查等核心功能。这个项目非常适合Python初学者巩固基础知识,同时也是一个实用的小工具。
🌟 功能特点
- 添加联系人:录入姓名、电话、邮箱、地址等信息
- 删除联系人:根据姓名查找并删除指定联系人
- 修改联系人:更新已有联系人的信息
- 查询联系人:根据姓名精确查找联系人
- 显示所有联系人:以列表形式展示所有联系人
- 数据持久化:自动保存到JSON文件,程序重启后数据不丢失
💻 完整代码实现
import json
import osCONTACTS_FILE = "contacts.json"def load_contacts():"""加载通讯录数据"""if os.path.exists(CONTACTS_FILE):with open(CONTACTS_FILE, 'r') as f:return json.load(f)return []def save_contacts(contacts):"""保存通讯录数据"""with open(CONTACTS_FILE, 'w') as f:json.dump(contacts, f, indent=4)def input_contact_info():"""输入联系人信息"""return {"name": input("请输入姓名:").strip(),"phone": input("请输入电话:").strip(),"email": input("请输入邮箱:").strip(),"address": input("请输入地址:").strip()}def add_contact(contacts):"""添加联系人"""new_contact = input_contact_info()contacts.append(new_contact)save_contacts(contacts)print("联系人添加成功!")def find_contacts_by_name(contacts, name):"""根据姓名查找联系人"""return [(i, c) for i, c in enumerate(contacts) if c["name"].lower() == name.lower()]def delete_contact(contacts):"""删除联系人"""name = input("请输入要删除的联系人姓名:").strip()matches = find_contacts_by_name(contacts, name)if not matches:print("未找到相关联系人。")returnprint("找到以下联系人:")for idx, (i, c) in enumerate(matches):print(f"{idx + 1}. {c['name']} | {c['phone']} | {c['email']}")try:choice = int(input("请选择要删除的序号(0取消):"))if 1 <= choice <= len(matches):del contacts[matches[choice - 1][0]]save_contacts(contacts)print("删除成功!")elif choice != 0:print("无效的序号")except ValueError:print("输入错误,请输入数字")def modify_contact(contacts):"""修改联系人"""name = input("请输入要修改的联系人姓名:").strip()matches = find_contacts_by_name(contacts, name)if not matches:print("未找到相关联系人。")returnprint("找到以下联系人:")for idx, (i, c) in enumerate(matches):print(f"{idx + 1}. {c['name']} | {c['phone']} | {c['email']}")try:choice = int(input("请选择要修改的序号(0取消):"))if 1 <= choice <= len(matches):index = matches[choice - 1][0]old_contact = contacts[index]print("请输入新信息(留空保持不变)")new_info = input_contact_info()# 保留未修改的字段for key in new_info:if not new_info[key]:new_info[key] = old_contact[key]contacts[index] = new_infosave_contacts(contacts)print("修改成功!")elif choice != 0:print("无效的序号")except ValueError:print("输入错误,请输入数字")def search_contact(contacts):"""查询联系人"""name = input("请输入要查询的姓名:").strip()matches = find_contacts_by_name(contacts, name)if not matches:print("未找到相关联系人")returnprint(f"找到 {len(matches)} 条结果:")for i, c in matches:print(f"姓名:{c['name']}")print(f"电话:{c['phone']}")print(f"邮箱:{c['email']}")print(f"地址:{c['address']}\n")def display_contacts(contacts):"""显示所有联系人"""if not contacts:print("通讯录为空")returnprint("\n所有联系人:")for idx, contact in enumerate(contacts, 1):print(f"{idx}. {contact['name']} | {contact['phone']} | {contact['email']}")def show_menu():"""显示主菜单"""print("\n通讯录管理系统")print("1. 添加联系人")print("2. 删除联系人")print("3. 修改联系人")print("4. 查询联系人")print("5. 显示所有联系人")print("6. 退出系统")def main():contacts = load_contacts()while True:show_menu()choice = input("请选择操作(1-6):").strip()if choice == '1':add_contact(contacts)elif choice == '2':delete_contact(contacts)elif choice == '3':modify_contact(contacts)elif choice == '4':search_contact(contacts)elif choice == '5':display_contacts(contacts)elif choice == '6':print("感谢使用,再见!")breakelse:print("无效的输入,请重新选择")if __name__ == "__main__":main()
🔍 代码解析与知识点
1. 数据存储与序列化
本项目使用JSON格式存储通讯录数据,这体现了几个重要的编程概念:
- JSON序列化与反序列化:使用
json.dump()
和json.load()
实现Python对象与JSON文本的转换 - 文件操作:使用
with
语句安全地打开和关闭文件,避免资源泄露 - 数据持久化:将内存中的数据保存到磁盘,实现程序重启后数据不丢失
# JSON序列化示例
with open(CONTACTS_FILE, 'w') as f:json.dump(contacts, f, indent=4) # indent参数使JSON格式化输出,提高可读性
2. 数据结构设计
- 列表存储多个联系人:使用Python列表存储多个联系人记录
- 字典存储联系人属性:每个联系人使用字典存储,键为属性名,值为属性值
- 索引与数据的映射:使用列表推导式创建索引与联系人数据的映射关系
# 列表推导式与元组打包示例
return [(i, c) for i, c in enumerate(contacts) if c["name"].lower() == name.lower()]
3. 函数模块化设计
代码采用了高度模块化的设计思想,每个功能都被封装到独立的函数中:
- 单一职责原则:每个函数只负责一个明确的任务
- 高内聚低耦合:函数之间通过参数传递数据,减少全局变量
- 代码复用:如
find_contacts_by_name()
被多个功能函数复用
4. 用户交互设计
- 菜单驱动界面:通过数字选项驱动程序流程
- 输入验证与错误处理:使用
try-except
捕获可能的输入错误 - 用户友好提示:提供清晰的操作提示和结果反馈
# 异常处理示例
try:choice = int(input("请选择要修改的序号(0取消):"))# 处理逻辑
except ValueError:print("输入错误,请输入数字")
5. 字符串处理技巧
- 字符串格式化:使用f-string实现简洁的字符串插值
- 字符串清理:使用
strip()
移除输入中的前后空白 - 大小写不敏感比较:使用
lower()
实现忽略大小写的字符串比较
# f-string格式化示例
print(f"{idx + 1}. {c['name']} | {c['phone']} | {c['email']}")
🚀 实际应用场景
- 个人通讯录管理:整理和管理个人联系人信息
- 小型团队联系人共享:在小型团队中共享和维护联系人信息
- 学习项目:作为Python初学者的实践项目,巩固基础知识
- 原型系统:作为更复杂联系人管理系统的原型或基础
🔧 进阶改进方向
- 搜索功能增强:添加模糊搜索、多字段搜索功能
- 数据验证:增加电话号码、邮箱格式验证
- 分组管理:添加联系人分组功能
- 用户界面优化:开发图形用户界面(GUI)
- 数据备份与恢复:添加数据备份和恢复功能
- 多用户支持:添加用户账户和权限管理
📚 学习要点总结
- Python基础语法:函数定义、条件语句、循环结构
- 数据结构应用:列表、字典、元组的灵活使用
- 文件操作:读写文件、异常处理
- JSON处理:序列化与反序列化
- 函数式编程:列表推导式、函数封装
- 用户交互设计:输入处理、菜单设计、反馈机制
通过这个项目,您不仅可以掌握Python编程的基础知识,还能学习到软件设计的核心概念和最佳实践。无论是作为学习案例还是实用工具,这个通讯录管理系统都能满足您的需求。
后期会改写成django框架的形式完成这个小项目,实现界面化
今日分享语录
你的孤独,虽败犹荣
相关文章:
Python实战:打造高效通讯录管理系统
📋 编程基础第一期《8-30》–通讯录管理系统 📑 项目介绍 在信息化时代,高效管理个人或团队联系人信息变得尤为重要。本文将带您实现一个基于Python的通讯录管理系统,该系统采用字典数据结构和JSON文件存储,实现了联系…...

图解深度学习 - 基于梯度的优化(梯度下降)
在模型优化过程中,我们曾尝试通过手动调整单个标量系数来观察其对损失值的影响。具体来说,当初始系数为0.3时,损失值为0.5。随后,我们尝试增加系数至0.35,发现损失值上升至0.6;相反,当系数减小至…...

MySql--定义表存储引擎、字符集和排序规则
示例: CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,email VARCHAR(100) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;注意事项: 字符集和排序规则可以按列覆盖表…...
【部署】在离线服务器的docker容器下升级dify-import程序
回到目录 在离线服务器的docker容器下升级dify-import程序 dify 0.1.0-release 变化很大,重构整个项目代码并且增加制度类txt文件知识库父子分段支持,详见 读取制度类txt文件导入dify的父子分段知识库(20250526发布). 。下面是kylin Linux环境下&#…...

优化版本,增加3D 视觉 查看前面的记录
上图先 运来的超出发表上限,重新发。。。 #11:06:57Current_POS_is: X:77Y:471Z:0U:-2 C:\Log\V55.txt import time import tkinter as tk from tkinter import messagebox from PIL import Image, ImageTk import socket import threading from date…...
写作-- 复合句练习
文章目录 练习 11. 家庭的支持和老师的指导对学生的学术成功有积极影响。2. 缺乏准备和未能适应通常会导致在挑战性情境中的糟糕表现。3. 吃垃圾食品和忽视锻炼可能导致严重的健康问题,因此人们应注重保持均衡的生活方式。4. 昨天的大雨导致街道洪水泛滥,因此居民们迁往高地以…...

WWW22-可解释推荐|用于推荐的神经符号描述性规则学习
论文来源:WWW 2022 论文链接:https://web.archive.org/web/20220504023001id_/https://dl.acm.org/doi/pdf/10.1145/3485447.3512042 最近读到一篇神经符号集成的论文24年底TOIS的,神经符号集成是人工智能领域中,将符号推理与深…...

Linux:shell脚本常用命令
一、设置主机名称 1、查看主机名称 2、用文件的方式更改主机名称 重启后: 3、 通过命令修改主机名 重启后: 二、网络管理命令 1、查看网卡 2、设置网卡 (1)网卡未被设置过时 (2)当网卡被设定,…...
专业课复习笔记 11
从今天开始每天下午复习专业课。慢慢复习专业课。目标至少考一个一百分吧。毕竟专业课还是比较难的。要是考不到一百分,我感觉自己就废掉了呢。下面稍微复习一下计组。 复习指令格式和数据通路设计。完全看不懂,真是可恶啊。计组感觉就是死记硬背&#…...

OpenTelemetry × Elastic Observability 系列(一):整体架构介绍
本文是 OpenTelemetry Elastic Observability 系列的第一篇,将介绍 OpenTelemetry Demo 的整体架构,以及如何集成 Elastic 来采集和可视化可观测性数据。后续文章将分别针对不同编程语言,深入讲解 OpenTelemetry 的集成实践。 程序架构 Op…...

STM32高级物联网通信之以太网通讯
目录 以太网通讯基础知识 什么是以太网 互联网和以太网的区别 1)概念与范围 (1)互联网 (2)以太网 2)技术特点 (1)互联网 (2)以太网 3)应…...
从Java的Jvm的角度解释一下为什么String不可变?
从Java的Jvm的角度解释一下为什么String不可变? 从 JVM 的角度看,Java 中 String 的不可变性是由多层次的机制共同保障的,这些设计涉及内存管理、性能优化和安全保障: 1. JVM 内存模型与字符串常量池 字符串常量池(St…...
从零开始的数据结构教程(四) 图论基础与算法实战
🌐 标题一:图的表示——六度空间理论如何用代码实现? 核心需求 图(Graph)是用于表达实体间关系的强大数据结构,比如社交网络中的好友关系,或者城市路网的交叉路口连接。关键在于如何高效存储和…...

历年西安交通大学计算机保研上机真题
2025西安交通大学计算机保研上机真题 2024西安交通大学计算机保研上机真题 2023西安交通大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 计算圆周率近似值 题目描述 根据公式 π / 4 1 − 1 / 3 1 / 5 − 1 / 7 … \pi / 4 1 - 1/3 1/5 - …...
可视化与动画:构建沉浸式Vue应用的进阶实践
在现代Web应用中,高性能可视化和流畅动画已成为提升用户体验的核心要素。本节将深入探索Vue生态中的可视化与动画技术,分享专业级解决方案与最佳实践。 一、 Canvas高性能渲染体系 01、Konva.js流程图引擎深度优化 <template><div class"…...
Python |GIF 解析与构建(3):简单哈希压缩256色算法
Python |GIF 解析与构建(3):简单哈希压缩256色算法 目录 Python |GIF 解析与构建(3):简单哈希压缩256色算法 一、算法性能表现 二、算法核心原理与实现 (一…...
蓝桥杯2114 李白打酒加强版
问题描述 话说大诗人李白, 一生好饮。幸好他从不开车。 一天, 他提着酒显, 从家里出来, 酒显中有酒 2 斗。他边走边唱: 无事街上走,提显去打酒。 逢店加一倍, 遇花喝一斗。 这一路上, 他一共遇到店 N 次, 遇到花 M 次。已知最后一次遇到的是花, 他正好把酒喝光了。…...

基本数据指针的解读-C++
1、引言 笔者认为对于学习指针要弄清楚如下问题基本可以应付大部分的场景: ① 指针是什么? ② 指针的类型是什么? ③ 指针指向的类型是什么? ④ 指针指向了哪里? 2、如何使用指针 使用时的步骤如下: ① …...
Android Studio里的BLE数据接收策略
#本人是初次接触Android蓝牙开发,若有不对地方,欢迎指出。 #由于是讲接收数据策略(其中还包含数据发送的部分策略),因此其他问题部分不会讲述,只描述数据接收。 简介(对于客户端---手机端) 博主在处理数据接收的时候࿰…...
【Office】Excel两列数据比较方法总结
在Excel中,比较两列数据是否相等有多种方法,以下是常用的几种方式: 方法1:使用公式(返回TRUE/FALSE) 在空白列(如C列)输入公式,向下填充即可逐行比较两列(如…...

基于多模态脑电、音频与视觉信号的情感识别算法【Nature核心期刊,EAV:EEG-音频-视频数据集】
简述 理解情感状态对于开发下一代人机交互界面至关重要。社交互动中的人类行为会引发受感知输入影响的心理生理过程。因此,探索大脑功能与人类行为的努力或将推动具有类人特质人工智能模型的发展。这里原作者推出一个多模态情感数据集,包含42名参与者的3…...

【QueryServer】dbeaver使用phoenix连接Hbase(轻客户端方式)
一、轻客户端连接方式 (推荐) 演示无认证配置方式, 有认证填入下方有认证参数即可 1, 新建连接 → Hadoop/大数据 → Apache Phoenix 2, 手动配置QueryServer驱动: 填入: “类名”, “URL模版”(注意区分有无认证), “端口号”, (勾选无认证) 类名: org.apache.phoenix…...
数据湖 (特点+与数据仓库和数据沼泽的对比讲解)
数据湖就像一个“数据水库”,把企业所有原始数据(结构化的表格、半结构化的日志、非结构化的图片/视频)原样存储,供后续按需分析。 对比传统数据仓库: 数据仓库数据湖数据清洗后的结构化数据(如Excel表格&…...
深入链表剖析:从原理到 C 语言实现,涵盖单向、双向及循环链表全解析
1 引言 在数据结构的学习中,链表是一种基础且极为重要的线性数据结构。与数组不同,链表通过指针将一系列节点连接起来,每个节点包含数据域和指向下一个节点的指针域。这种动态的存储方式使得链表在插入、删除等操作上具有独特的优势。本文将深…...
编码总结如下
VS2019一般的编码是UTF-8编码, win11操作系统的编码可能为GB2312,VS整个工程中使用的都是UTF-8编码,但是在系统内生成的其他文件夹的名字则是系统的编码 如何选择? Qt 项目:优先用 QString 和 QByteArray(…...
《算力觉醒!ONNX Runtime + DirectML如何点燃Windows ARM设备的AI引擎》
ONNX Runtime是一个跨平台的高性能推理引擎,它就像是一位精通多种语言的翻译官,能够无缝运行来自不同深度学习框架转化为ONNX格式的模型。这种兼容性打破了框架之间的隔阂,让开发者可以将更多的精力投入到模型的优化和应用中。 从内部机制来…...

[9-1] USART串口协议 江协科技学习笔记(13个知识点)
1 2 3 4全双工就是两个数据线,半双工就是一个数据线 5 6 7 8 9 10 TTL(Transistor-Transistor Logic)电平是一种数字电路中常用的电平标准,它使用晶体管来表示逻辑状态。TTL电平通常指的是5V逻辑电平,其中:…...

Oracle基础知识(五)——ROWID ROWNUM
目录 一、ROWID 伪列 二、ROWNUM——限制查询结果集行数 1.ROWNUM使用介绍 2.使用ROWNUM进行分页查询 3.使用ROWNUM查看薪资前五位的员工 4.查询指定条数直接的数据 三、ROWNUM与ROWID不同 一、ROWID 伪列 表中的每一行在数据文件中都有一个物理地址,ROWID…...
简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点: Lock能完成synchronized所实现的所有功能。 主要不同点: Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放Lock还有更强大…...
OpenCV CUDA模块直方图计算------在 GPU 上计算图像直方图的函数calcHist()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 OpenCV 的 CUDA 模块 中用于在 GPU 上计算图像直方图的一个函数。 计算单通道 8-bit 图像的灰度直方图(Histogram)。 该函…...