展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > 使用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. 语义化变量namen好一百倍。

为什么重要?

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

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 Python
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

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

Windows

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

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

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

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。