当前位置:

首页 > 编程开发 > 使用Python实现通讯录程序的增删改查(CRUD)功能

使用Python实现通讯录程序的增删改查(CRUD)功能

基于Python语言,采用字典列表作为数据结构,实现通讯录的增删改查功能。字典列表结构清晰、扩展性强,支持快速添加、删除、查询和修改联系人信息,适合初学者巩固语法和文件处理基础。

引言

在数字时代,高效管理联系人信息几乎是每个人的刚需。一个简单的通讯录程序,不仅能帮你快速找到某个号码,还能大幅提升日常工作效率。今天我们就来亲手用Python打造一个功能完整的通讯录——专注增删改查(CRUD)这四个核心操作。通过这个项目,你不仅能巩固Python基础语法、熟悉数据结构和文件处理,还能为后续更复杂的应用打下扎实的底子。

为什么选择Python实现通讯录?

Python的简洁语法和强大的标准库,让它成为初学者的“第一语言”。你不需要复杂的配置,就能快速搭起一个实用工具。通讯录程序之所以是绝佳的练习项目,是因为它:

  • 用到了最基础的数据结构(列表/字典)
  • 包含了用户交互的逻辑
  • 涉及文件的持久化存储
  • 完全不需要外部依赖

根据2023年Stack Overflow开发者调查,Python在初学者友好度上排名第一。话不多说,咱们直接开始吧。

数据结构设计:联系人存储的核心

动手写代码之前,先想清楚怎么存数据。这里我们选择字典列表作为存储方案:

contacts = [
    {"name": "Alice", "phone": "123-456-7890", "email": "alice@example.com"},
    {"name": "Bob", "phone": "987-654-3210", "email": "bob@example.com"}
]

为什么是字典列表?

  1. 结构清晰:每个联系人用一个独立的字典表示,属性(name/phone/email)一目了然。
  2. 查询高效:遍历列表就能快速找到目标。
  3. 扩展性强:想加个地址字段?直接在字典里加一个键就行,完全不影响已有逻辑。

对比一下其他方案:

  • ✅ 字典列表:最佳选择
  • ❌ 元组列表:元组不可修改,想改联系人信息就得重建,麻烦
  • ❌ 单字典:一个字典只能存一个人,通讯录……不成立
  • ❌ 字符串列表:把姓名、电话、邮箱全塞进一个字符串?解析起来简直噩梦

数据结构性能分析

操作字典列表元组列表时间复杂度
添加O(1)O(1)O(1)
删除O(n)O(n)O(n)
查询O(n)O(n)O(n)
修改O(n)O(n)O(n)

关键点:虽然查询和删除是O(n),但普通人的通讯录能有几百条就了不起了(<1000条),实际跑起来毫无压力。Python的列表遍历优化得很好,别为了追求理论上的O(1)去搞复杂结构——没必要。

实现"增"功能:添加联系人

添加联系人是最基础的操作,需要处理用户输入和验证。

完整代码实现

def add_contact(contacts):
    print("n? 添加新联系人")
    name = input("姓名: ").strip()
    
    # 重复检查:避免重复添加
    if any(contact["name"] == name for contact in contacts):
        print("⚠️ 错误:联系人已存在!")
        return
    
    # 输入验证
    phone = input("电话: ").strip()
    while not is_valid_phone(phone):
        print("⚠️ 电话格式错误!需包含数字和连字符(如 123-456-7890)")
        phone = input("电话: ").strip()
    
    email = input("邮箱: ").strip()
    while not is_valid_email(email):
        print("⚠️ 邮箱格式错误!需包含@符号(如 name@example.com)")
        email = input("邮箱: ").strip()
    
    # 创建并添加联系人
    new_contact = {
        "name": name,
        "phone": phone,
        "email": email
    }
    contacts.append(new_contact)
    print(f"✅ 联系人 {name} 添加成功!")

关键细节解析

  1. 输入清理:strip()用来去掉用户手滑敲的空格
  2. 重复检查:用any()加列表推导式,简洁又高效
  3. 输入验证:
    • 电话验证:is_valid_phone()检查格式
    • 邮箱验证:is_valid_email()确保有@和点

验证函数实现

def is_valid_phone(phone):
    """验证电话号码格式(示例:123-456-7890)"""
    if len(phone) < 7:  # 最短电话长度
        return False
    parts = phone.split('-')
    if len(parts) != 3:  # 应有3部分
        return False
    return all(part.isdigit() for part in parts)

def is_valid_email(email):
    """验证邮箱格式(包含@符号)"""
    return '@' in email and '.' in email

添加功能流程图

使用Python实现通讯录程序的增删改查(CRUD)功能

为什么需要验证?无效数据就像定时冲击波,后续功能随时可能崩。按Python官方最佳实践,输入验证是健壮程序的基石。

实现"删"功能:删除联系人

删除操作需要处理匹配、移除和友好的用户反馈。

完整代码实现

def delete_contact(contacts):
    print("n?️ 删除联系人")
    name = input("输入要删除的姓名: ").strip()
    
    # 查找并删除
    for i in range(len(contacts)):
        if contacts[i]["name"].lower() == name.lower():
            del contacts[i]
            print(f"✅ 联系人 {name} 已删除!")
            return
    
    print(f"❌ 未找到联系人 {name}!")

关键优化点

  1. 大小写不敏感:.lower()确保"John"和"john"都能匹配
  2. 索引遍历:用索引删除,避免在遍历时修改列表导致错乱
  3. 即时反馈:成功还是没找到,一眼看清

为什么用索引遍历?

在Python中,直接在循环里用remove()可能会踩坑:

# 错误示例(可能跳过元素)
for contact in contacts:
    if contact["name"] == name:
        contacts.remove(contact)  # 如果连续两个匹配,第二个会被跳过

删除功能流程图

使用Python实现通讯录程序的增删改查(CRUD)功能

常见问题解决

问题:删除后列表索引错位,导致漏删或多删。

解决方案:用del contacts[i] + 索引遍历,如上代码所示,安全可靠。

实现"改"功能:修改联系人信息

修改功能不仅要能改,还得让用户感觉方便。

完整代码实现

def edit_contact(contacts):
    print("n✏️ 修改联系人")
    name = input("输入要修改的姓名: ").strip()
    
    # 查找联系人
    for contact in contacts:
        if contact["name"].lower() == name.lower():
            print(f"当前信息: {contact['phone']} | {contact['email']}")
            print("输入新值(留空跳过):")
            
            # 逐字段更新
            new_phone = input(f"电话 [{contact['phone']}]: ").strip()
            if new_phone:
                while not is_valid_phone(new_phone):
                    print("⚠️ 电话格式错误!")
                    new_phone = input(f"电话 [{contact['phone']}]: ").strip()
                contact["phone"] = new_phone
            
            new_email = input(f"邮箱 [{contact['email']}]: ").strip()
            if new_email:
                while not is_valid_email(new_email):
                    print("⚠️ 邮箱格式错误!")
                    new_email = input(f"邮箱 [{contact['email']}]: ").strip()
                contact["email"] = new_email
            
            print(f"✅ 联系人 {name} 信息已更新!")
            return
    
    print(f"❌ 未找到联系人 {name}!")

核心设计思想

  1. 部分更新:用户只想改电话,那邮箱留空就行,不用把老信息再输入一遍。
  2. 默认值提示:[当前值]让用户一眼知道现在是什么,避免重复劳动。
  3. 字段级验证:只验证用户修改了的字段,没动的就不管。

为什么保留默认值?

用户体验设计:UX Collective关于表单设计的经典结论——“显示默认值能显著减少认知负担,提高填写速度”。

修改功能流程图

使用Python实现通讯录程序的增删改查(CRUD)功能

实现"查"功能:查询联系人

查询是通讯录最常用的功能,这里先实现精确匹配。

完整代码实现

def search_contact(contacts):
    print("n? 查询联系人")
    name = input("输入姓名: ").strip()
    
    # 精确匹配查询
    found = False
    for contact in contacts:
        if contact["name"].lower() == name.lower():
            print(f"n✅ 找到联系人:")
            print(f"姓名: {contact['name']}")
            print(f"电话: {contact['phone']}")
            print(f"邮箱: {contact['email']}")
            found = True
    
    if not found:
        print(f"❌ 未找到联系人 {name}!")

查询优化点

  1. 大小写不敏感:.lower()保证匹配。
  2. 清晰输出:分项显示,一目了然。
  3. 即时反馈:找到还是没找到,立马知道。

高级查询扩展(可选)

如果你想让用户输入“Joh”也能搜到“John”,只需要把匹配条件改成包含关系:

if name.lower() in contact["name"].lower():
    # 匹配逻辑

完整程序整合:主逻辑

现在把上面几个功能拼到一起,加上一个主菜单循环。

主程序代码

def main():
    print("? 通讯录程序启动!")
    
    # 加载初始数据
    contacts = load_contacts()
    
    while True:
        print("n===== 通讯录菜单 =====")
        print("1. 添加联系人")
        print("2. 删除联系人")
        print("3. 修改联系人")
        print("4. 查询联系人")
        print("5. 退出程序")
        
        choice = input("选择操作 (1-5): ")
        
        if choice == '1':
            add_contact(contacts)
        elif choice == '2':
            delete_contact(contacts)
        elif choice == '3':
            edit_contact(contacts)
        elif choice == '4':
            search_contact(contacts)
        elif choice == '5':
            sa ve_contacts(contacts)
            print("? 程序已退出,数据已保存!")
            break
        else:
            print("⚠️ 无效选择,请输入1-5的数字")

if __name__ == "__main__":
    main()

用户交互流程

使用Python实现通讯录程序的增删改查(CRUD)功能

数据持久化:文件存储实现

数据存在内存里,一重启就没了——这显然不行。所以要用文件把联系人存下来。

JSON文件操作代码

import json

def sa ve_contacts(contacts, filename="contacts.json"):
    """将联系人保存到JSON文件"""
    try:
        with open(filename, 'w') as f:
            json.dump(contacts, f, indent=4)
        print(f"? 数据已保存到 {filename}!")
    except Exception as e:
        print(f"❌ 保存失败: {str(e)}")

def load_contacts(filename="contacts.json"):
    """从JSON文件加载联系人"""
    try:
        with open(filename, 'r') as f:
            return json.load(f)
    except FileNotFoundError:
        print("⚠️ 文件未找到,使用空列表")
        return []
    except json.JSONDecodeError:
        print("⚠️ 文件格式错误,使用空列表")
        return []

为什么选择JSON?

  1. 人类可读:用记事本打开也能看懂。
  2. Python原生支持:json模块是标准库的一部分,无需安装。
  3. 跨平台:JSON是行业标准格式,其他语言也能读。

文件操作流程图

使用Python实现通讯录程序的增删改查(CRUD)功能

错误处理:让程序更健壮

一个健壮的程序,不是没有bug,而是能优雅地处理各种意外。

常见错误场景

错误类型代码处理用户提示
文件不存在FileNotFoundError“文件未找到,使用空列表”
无效JSONJSONDecodeError“文件格式错误”
无效输入自定义验证“格式错误,请重试”
重复添加any()检查“联系人已存在”

完整错误处理示例

def sa ve_contacts(contacts, filename="contacts.json"):
    try:
        with open(filename, 'w') as f:
            json.dump(contacts, f, indent=4)
        print("✅ 数据已保存!")
    except PermissionError:
        print("❌ 无权写入文件!")
    except Exception as e:
        print(f"❌ 保存失败: {str(e)}")

最佳实践:参考Real Python的错误处理指南,应该:

  1. 捕获特定异常,而不是一把抓
  2. 提供具体错误信息,方便定位问题
  3. 保持程序继续运行,别直接崩溃

代码优化:提升可读性

写代码不只是写给机器看的,更是写给人看的。

优化前 vs 优化后

原始代码:

def add(contacts):
    n = input("n: ")
    p = input("p: ")
    e = input("e: ")
    contacts.append({"n":n,"p":p,"e":e})

优化后:

def add_contact(contacts):
    """添加新联系人并验证输入"""
    name = input("姓名: ").strip()
    # ... 验证逻辑 ...
    contacts.append({"name": name, "phone": phone, "email": email})

优化点

  1. 有意义的名称:add_contact一眼知道是干啥的,add太模糊。
  2. 清晰的注释:函数开头写一句docstring,说明目的。
  3. 输入清理:strip()去掉空格。
  4. 语义化变量:name比n好一百倍。

为什么重要?

Google Python风格指南里写得明明白白:代码可读性比性能更重要。可读性好的代码,维护成本能降低50%以上。

实际运行演示

来看一次完整的操作示例:

? 通讯录程序启动!

===== 通讯录菜单 =====
1. 添加联系人
2. 删除联系人
3. 修改联系人
4. 查询联系人
5. 退出程序
选择操作 (1-5): 1

? 添加新联系人
姓名: Alice
电话: 123-456-7890
邮箱: alice@example.com
✅ 联系人 Alice 添加成功!

===== 通讯录菜单 =====
1. 添加联系人
2. 删除联系人
3. 修改联系人
4. 查询联系人
5. 退出程序
选择操作 (1-5): 4

? 查询联系人
输入姓名: Alice

✅ 找到联系人:
姓名: Alice
电话: 123-456-7890
邮箱: alice@example.com

===== 通讯录菜单 =====
1. 添加联系人
2. 删除联系人
3. 修改联系人
4. 查询联系人
5. 退出程序
选择操作 (1-5): 5
? 数据已保存到 contacts.json!
? 程序已退出,数据已保存!

项目扩展方向

1. 添加更多字段

# 在字典中添加地址字段
new_contact = {
    "name": name,
    "phone": phone,
    "email": email,
    "address": input("地址: ").strip()  # 新增字段
}

2. 实现搜索增强

# 部分匹配搜索
def search_partial(contacts, query):
    query = query.lower()
    return [c for c in contacts if query in c["name"].lower()]

3. 图形界面(Tkinter)

import tkinter as tk

def create_gui():
    window = tk.Tk()
    window.title("通讯录")
    # 创建输入框、按钮等
    # ... GUI逻辑 ...
    window.mainloop()

为什么这个项目是学习Python的完美起点?

覆盖核心概念:

  • 数据结构(列表/字典)
  • 函数封装
  • 文件I/O
  • 错误处理
  • 用户交互

真实应用场景:

  • 解决日常真实问题
  • 写完就能用,成就感来得快
  • 学习曲线平缓

可扩展性:

  • 从命令行到图形界面,从本地存储到数据库——能一步步迭代
  • 你完全可以根据需要往里加功能

数据支撑:2023年Python开发者报告显示,85%的初学者是通过类似的项目真正掌握基础的。

常见问题解答(FAQ)

Q1: 为什么不用数据库?

A: 通讯录数据量小(<1000条),JSON文件完全够用。数据库适合大数据量、多用户并发场景,在这里反而增加了不必要的复杂度。

Q2: 如何处理中文字符?

A: Python 3默认使用Unicode,你直接写中文名字、中文备注都没问题。唯一要注意的是文件编码,保存JSON时用UTF-8即可(json模块默认就是UTF-8)。

Q3: 如何添加删除确认?

A: 在删除前加个确认提示:

if input(f"确定删除 {name}? (y/n): ").lower() == 'y':
    del contacts[i]

Q4: 如何备份数据?

A: 加个简单的自动备份函数:

def backup_contacts():
    import shutil
    shutil.copy("contacts.json", "contacts_backup.json")

结语:编程的艺术

构建这个通讯录程序,本质上是在练习一种思维方式:

  • 问题分解:把“做个通讯录”拆成增、删、改、查、存文件几个小任务
  • 数据思维:用什么样的数据结构最合适?
  • 用户导向:如何让交互更顺手?
  • 健壮性思维:用户输错了怎么办?文件被删了怎么办?

编程名言:“好的程序不是没有bug,而是能优雅地处理错误。” —— Python社区

现在,去复制代码、运行程序、自己动手改一改吧。别怕出错——每个报错都是一次学习。记住,编程的精髓在于实践。

在这个过程中,你会慢慢体会到Python的简洁之美,也会尝到“让计算机替你干活”的甜头。这个通讯录程序,是你通往编程世界的第一扇门。

最后,用Python之父的一句话收尾:

“Python is designed to be readable, not just executable.”

—— Guido van Rossum

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Python
相关文章 更多
langgraph python guide中文入门教程详解
langgraph python guide中文入门教程详解

本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

Windows 安装 Python:从官方入口到虚拟环境的可复现实践
Windows 安装 Python:从官方入口到虚拟环境的可复现实践

面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

Windows系统Python安装教程:下载、勾选PATH及环境变量配置
Windows系统Python安装教程:下载、勾选PATH及环境变量配置

针对Windows初学者的Python安装实战指南。详细讲解如何从Python官网下载匹配架构的安装包,重点演示安装首屏勾选“Add python.exe to PATH”的关键操作,并提供使用python --version和py命令验证环境变量的具体步骤,帮助新手快速搭建开发环境并排查路径问题。

Python安装后怎么打开:使用IDLE或命令行启动解释器
Python安装后怎么打开:使用IDLE或命令行启动解释器

刚在Windows安装好Python却不知道如何启动?本文详细演示如何通过开始菜单找到并打开IDLE集成开发环境,以及如何在PowerShell或命令提示符中使用python和py命令启动交互式解释器、运行.py脚本文件。包含退出解释器的方法及常见启动问题排查,帮助初学者快速验证安装成功并开始编写代码。

了解Python编程领域中最好的就业行业
了解Python编程领域中最好的就业行业

了解Python编程领域中最好的就业行业导语:近年来,Python作为一种易学易用的编程语言,越来越受到企业和开发者的青睐。在Python编程领域中,有许多就业机会,涵盖了各个行业。本文将介绍一些Python编程领域中最好的就业行业,并提供相应的代码示例。数据科学和机器学习数据科学和机器学习是Python编程领域中最热门的行业之一。Python在数据科学和机

python处理csv文件的方法完整实用教程
python处理csv文件的方法完整实用教程

针对Python处理CSV文件时常见的编码报错、内存溢出和数据类型错误,本文对比标准库csv与Pandas库的适用场景,提供可复制的代码示例和因果排查思路,帮助开发者选择最优处理方案。

python字典怎么按值排序用sorted函数实现升降序
python字典怎么按值排序用sorted函数实现升降序

本文介绍如何使用Python的sorted函数对字典按值进行升序和降序排序,结合具体代码示例和应用场景,帮助读者理解排序逻辑及其在数据处理中的实际价值。

python正则匹配修改方法与代码实现教程
python正则匹配修改方法与代码实现教程

深入讲解Python中使用re.sub进行正则匹配与替换的技巧,涵盖基础语法、分组引用及回调函数应用,帮助开发者解决复杂字符串修改需求,提升代码效率与可维护性。

selenium中文安装包下载与安装教程
selenium中文安装包下载与安装教程

详解Selenium在Python环境下的安装步骤,包括使用pip安装库文件、下载对应版本的浏览器驱动以及验证安装是否成功,适合自动化测试初学者参考。

skyvern官网入口及中文版使用教程
skyvern官网入口及中文版使用教程

Skyvern是一款基于大语言模型的开源浏览器自动化框架,目前仅提供英文界面且无官方中文版。本文指导用户通过GitHub获取源码,使用Docker快速部署本地环境,并解释其如何通过DOM树解析与自然语言指令实现网页自动操作,同时提供针对中文用户的配置建议与替代方案。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
PixPix 网页版
PixPix 网页版
Windows

PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。