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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82585.shtml
英文地址,請注明出處:http://en.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…