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']}")

🚀 实际应用场景

  1. 个人通讯录管理:整理和管理个人联系人信息
  2. 小型团队联系人共享:在小型团队中共享和维护联系人信息
  3. 学习项目:作为Python初学者的实践项目,巩固基础知识
  4. 原型系统:作为更复杂联系人管理系统的原型或基础

🔧 进阶改进方向

  1. 搜索功能增强:添加模糊搜索、多字段搜索功能
  2. 数据验证:增加电话号码、邮箱格式验证
  3. 分组管理:添加联系人分组功能
  4. 用户界面优化:开发图形用户界面(GUI)
  5. 数据备份与恢复:添加数据备份和恢复功能
  6. 多用户支持:添加用户账户和权限管理

📚 学习要点总结

  1. Python基础语法:函数定义、条件语句、循环结构
  2. 数据结构应用:列表、字典、元组的灵活使用
  3. 文件操作:读写文件、异常处理
  4. JSON处理:序列化与反序列化
  5. 函数式编程:列表推导式、函数封装
  6. 用户交互设计:输入处理、菜单设计、反馈机制

通过这个项目,您不仅可以掌握Python编程的基础知识,还能学习到软件设计的核心概念和最佳实践。无论是作为学习案例还是实用工具,这个通讯录管理系统都能满足您的需求。

后期会改写成django框架的形式完成这个小项目,实现界面化

今日分享语录

你的孤独,虽败犹荣

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

89. Java 数字和字符串 - Math 类深入解析

文章目录 89. Java 数字和字符串 - Math 类深入解析一、引言二、常量与基本方法2.1 Math 类常量2.2 绝对值和舍入绝对值方法舍入方法最小值和最大值 三、指数与对数方法四、三角函数方法五、总结 89. Java 数字和字符串 - Math 类深入解析 一、引言 在 Java 中&#xff0c;除…

STM32之SG90舵机控制(附视频讲解)

目录 前言&#xff1a; 一、硬件准备与接线 1.1 硬件清单 1.2 接线 二、 SG90舵机简介 1.1 外观 1.2 基本参数 1.3 引脚说明 1.4 控制原理 1.5 特点 1.6 常见问题 三、 单片机简介 四、 程序设计 4.1 定时器配置 4.2 角度控制函数 4.3 主函数调用 五、 总结 …

netstat命令Windows与Linux双平台

深入解析netstat命令:Windows与Linux双平台实战指南 netstat(Network Statistics)是网络诊断中最经典的工具之一,能够帮助用户查看网络连接、端口监听状态、路由表等信息。然而,Windows和Linux系统下的netstat在参数和输出格式上存在差异,容易让人混淆。本文将详细对比两…

攻防世界-ics-07

进入环境 进入项目管理 点击进行访问 是一堆代码进行审计 <?php session_start();if (!isset($_GET[page])) {show_source(__FILE__);die(); }if (isset($_GET[page]) && $_GET[page] ! index.php) {include(flag.php); }else {header(Location: ?pageflag.php);…

基于 Node.js 的 Express 服务是什么?

Express 是基于 ‌Node.js‌ 的一个轻量级、灵活的 Web 应用框架&#xff0c;用于快速构建 ‌HTTP 服务‌&#xff08;如网站、API 接口等&#xff09;&#xff0c;以下是详细解析&#xff1a; ‌一、Express 的核心作用‌ ‌简化 Node.js 原生开发‌ Node.js 原生 http 模块虽…

linux安装vscode以及配置vscode

vscode配置 1&#xff0c;准备工作2&#xff0c;VsCode安装插件3&#xff0c;cmake Tools 的使用 1&#xff0c;准备工作 所谓的准备工作&#xff0c;就是要让linux具备 vim gcc g编译器&#xff0c;可使用cmake&#xff0c;makefile等开发的条件。 首先我么以及有一个以安装好…

基于AI的智能农业病虫害识别系统实战指南

引言 在农业现代化进程中&#xff0c;病虫害防治始终是保障粮食安全的核心挑战。传统人工识别方式存在效率低、误判率高、响应滞后等问题。本文将通过完整的技术实现流程&#xff0c;展示如何利用Python生态构建智能病虫害识别系统&#xff0c;实现从图像采集到防治建议输出的…

【MySQL】第11节|MySQL 8.0 主从复制原理分析与实战(一)

一、MySQL主从复制基础 1. 核心概念 定义&#xff1a; MySQL主从复制是将主库&#xff08;Source/Master&#xff09;的数据变更同步到一个或多个从库&#xff08;Replica/Slave&#xff09;的机制&#xff0c;默认采用异步复制&#xff0c;支持全库、指定库或表的同步。 角…

【RabbitMQ】记录 InvalidDefinitionException: Java 8 date/time type

目录 1. 添加必要依赖 2. 配置全局序列化方案&#xff08;推荐&#xff09; 3. 配置RabbitMQ消息转换器 关键点说明 1. 添加必要依赖 首先确保项目中包含JSR-310支持模块&#xff1a; <dependency><groupId>com.fasterxml.jackson.datatype</groupId>&l…

【机器学习基础】机器学习入门核心算法:K-近邻算法(K-Nearest Neighbors, KNN)

机器学习入门核心算法&#xff1a;K-近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09; 一、算法逻辑1.1 基本概念1.2 关键要素距离度量K值选择 二、算法原理与数学推导2.1 分类任务2.2 回归任务2.3 时间复杂度分析 三、模型评估3.1 评估指标3.2 交叉验证调参 四、应用…

在h5端实现录音发送功能(兼容内嵌微信小程序) recorder-core

本文将通过一个实际的 Vue3 组件示例&#xff0c;带你一步步实现“按住录音&#xff0c;松开发送&#xff0c;上滑取消”的语音录制功能。 我们将使用强大且小巧的开源库 recorder-core&#xff0c;支持 MP3、WAV、AAC 等编码格式&#xff0c;兼容性较好。 &#x1f527; 项目…

深入掌握Node.js HTTP模块:从开始到放弃

文章目录 一、HTTP模块入门&#xff1a;从零搭建第一个服务器1.1 基础概念解析1.2 手把手创建服务器 二、核心功能深入解析2.1 处理不同请求类型2.2 实现文件下载功能 三、常见问题解决方案3.1 跨域问题处理3.2 防止服务崩溃3.3 调试技巧 四、安全最佳实践4.1 请求头安全设置4.…

SSM整合:Spring+SpringMVC+MyBatis完美融合实战指南

前言 在Java企业级开发领域&#xff0c;SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架组合一直占据着重要地位。这三个轻量级框架各司其职又相互配合&#xff0c;为开发者提供了高效、灵活的开发体验。本文将深入探讨SSM框架的整合过程&#xff0c;揭示整合背后的原…

[AI]大模型MCP快速入门及智能体执行模式介绍

[AI]大模型MCP快速入门及智能体执行模式介绍 一、MCP入门 介绍 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是一种由Anthropic公司于2024年提出的开放标准协议&#xff0c;旨在为大型语言模型&#xff08;LLM&#xff09;提供统一接口&am…

Mac M1 安装 ffmpeg

1.前言 官网那货没有准备m系列的静态包&#xff0c;然后我呢&#xff0c;不知道怎么想的就从maven项目中的 javacv-platform&#xff0c;且版本为1.5.11依赖里面将这个静态包把了出来&#xff0c;亲测能用&#xff0c;感觉比那些网上说的用什么wget编译安装、brew安装快多了。…

unity控制相机围绕物体旋转移动

记录一下控制相机围绕物体旋转与移动的脚本&#xff0c;相机操作思路分为两块&#xff0c;一部分为旋转&#xff0c;一部分为移动&#xff0c;旋转是根据当前center中心点的坐标&#xff0c;根据距离设置与默认的旋转进行位置移动&#xff0c;移动是根据相机的左右和前后进行计…

python打卡day38@浙大疏锦行

知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 一、首先加载CIFAR数据集 import torch import torchvi…

用户配置文件(Profile)

2.4.5 用户配置文件&#xff08;Profile&#xff09; 用户配置文件由以下组件构成&#xff1a; 一个运营商安全域&#xff08;MNO-SD&#xff09; 辅助安全域&#xff08;SSD&#xff09;和CASD Applets 应用程序&#xff08;如NFC应用&#xff09; 网络接入应用&#xff…

如何给自研MCP加上安全验证

前言 刚过去两个月,市面的 MCP 服务,如雨后春笋一般不断涌现出来,包括;百度、高德、网盘、支付宝。这些 MCP 服务,可以让我们基于 Spring AI 框架构建的 Agent 具备非常丰富的使用功能。同时这也说明,程序员👨🏻‍💻,应该具备开发 MCP 服务的能力,Spring AI 让 J…

Unity网络开发实践项目

摘要&#xff1a;该网络通信系统基于Unity实现&#xff0c;包含以下几个核心模块&#xff1a; 协议配置&#xff1a;通过XML定义枚举&#xff08;如玩家/英雄类型&#xff09;、数据结构&#xff08;如PlayerData&#xff09;及消息协议&#xff08;如PlayerMsg&#xff09;&a…