python实例1.2:创建一个简易的命令行地址簿程序,允许用户添加、删除、查找和编辑联系人(详解及其知识点拓展)

news/2024/5/1 8:38:15/文章来源:https://blog.csdn.net/jundao1997/article/details/137472538

目录

一、基础:地址簿程序代码附带注释

二、基础:地址簿程序详细分析

三、拓展:地址簿程序拓展,如何实现在地址簿程序中持久化数据?

四、拓展:地址簿程序拓展代码详细分析


一、基础:地址簿程序代码附带注释

下面是一个简易的命令行地址簿程序的代码,编写于Python中,它提供了添加、删除、查找和编辑联系人的功能。请注意,这只是一个基本的实现,实际应用中可能需要更复杂的错误处理和数据持久化。

python

# 初始的地址簿存储结构,使用字典来存储联系人信息
address_book = {}def add_contact():name = input("输入联系人名字: ")email = input("输入联系人邮箱: ")phone = input("输入联系人电话: ")address_book[name] = {'Email': email,'Phone': phone}print(f"{name} 已添加到地址簿。")def delete_contact():name = input("输入要删除的联系人名字: ")if name in address_book:del address_book[name]print(f"{name} 已从地址簿中删除。")else:print(f"联系人 {name} 不存在在地址簿中。")def find_contact():name = input("输入你想查找的联系人名字: ")if name in address_book:email = address_book[name]['Email']phone = address_book[name]['Phone']print(f"联系人 {name} 信息:邮箱: {email}, 电话: {phone}")else:print(f"联系人 {name} 不存在在地址簿中。")def edit_contact():name = input("输入你想编辑的联系人名字: ")if name in address_book:email = input(f"输入新的邮箱地址 (之前为 {address_book[name]['Email']}): ")phone = input(f"输入新的电话号码 (之前为 {address_book[name]['Phone']}): ")address_book[name] = {'Email': email,'Phone': phone}print(f"联系人 {name} 已更新。")else:print(f"联系人 {name} 不存在在地址簿中。")def main():while True:print("\n地址簿程序")print("1. 添加联系人")print("2. 删除联系人")print("3. 查找联系人")print("4. 编辑联系人")print("5. 退出程序")choice = input("请输入操作编号: ")if choice == '1':add_contact()elif choice == '2':delete_contact()elif choice == '3':find_contact()elif choice == '4':edit_contact()elif choice == '5':print("退出地址簿程序。")breakelse:print("无效的输入, 请重新输入编号。")if __name__ == '__main__':main()

这个程序运行后,将允许用户在命令行界面下选择操作,以管理其简易的地址簿。当用户输入对应功能的编号时,会运行相关的函数。

注意: 这个程序在每次运行结束后不会保存已经输入的数据。在实际应用中,可以把数据保存到一个文件或数据库中,实现数据持久化。这里的数据是暂存在内存中的,并且用字典表示,只有一个执行会话期间可以使用。如果要让地址簿持久存储,则需要编写额外的代码将其保存到磁盘上的文件,或者一个数据库中。

二、基础:地址簿程序详细分析

上面的Python代码是一个简易命令行地址簿程序的实现。它主要由五个函数构成,分别对应添加、删除、查找和编辑联系人的功能,以及一个主函数用于驱动整个程序的用户界面。下面我会逐一解析这些函数以及程序的结构和运行逻辑。

  1. address_book 字典

    该字典用于存储所有联系人的信息,其中每个联系人的名字作为键,与之关联的值是另一个字典,用于存储该联系人的Email和Phone信息。

  2. add_contact 函数

    此函数负责添加新的联系人到地址簿中。函数首先提示用户输入联系人的nameemailphone。然后,将这些信息存储在address_book字典中,name作为键,相关的Email和Phone作为嵌套的字典存放。完成后会输出添加成功的信息。

  3. delete_contact 函数

    此函数用于删除地址簿中的一个联系人。用户输入一个name,程序检查该名称是否存在于address_book字典中。如果存在,使用del操作删除对应的键值对,并输出删除成功的信息。如果名称不存在于字典中,则输出联系人不存在的信息。

  4. find_contact 函数

    当需要查找一个联系人的信息时,此函数被调用。用户输入一个name作为搜索项,程序检查address_book字典中是否存在该项。如果存在,输出该联系人的Email和Phone信息。如果不存在,告诉用户该联系人未找到。

  5. edit_contact 函数

    此函数允许用户编辑现存联系人的Email和Phone信息。用户先输入想要编辑的联系人的name,然后如果该用户存在于address_book中,程序会显示当前的Email和Phone信息,并提示用户输入新信息。更新后,输出联系人信息已更新的提示。

  6. main 函数

    这是程序的入口点,一个通过无限循环持续提供用户菜单选择的函数。在这个循环中,程序显示了一个包含操作选项的菜单,并提示用户输入操作编号。对于用户的输入,通过一系列的if..elif..else语句分发到不同的功能函数中。

    • 如果用户输入1,则调用add_contact()函数添加联系人。
    • 如果用户输入2,则调用delete_contact()函数删除联系人。
    • 如果用户输入3,则调用find_contact()函数查找联系人。
    • 如果用户输入4,则调用edit_contact()函数编辑联系人。
    • 如果用户输入5,则输出退出信息,并通过break语句跳出循环,结束程序。
    • 对于其他输入,提示用户无效输入,并要求重新输入。
  7. if name == 'main'块

    此代码块确保当该脚本被直接运行时,会调用main()函数。如果脚本是被导入到其他Python文件中,那么块内的代码不会被执行。

以上就是该简易命令行地址簿程序的完整解析。用户可以利用这个程序来管理他们的联系人信息,但需要注意,程序仅存在于内存中,一旦程序关闭,所有输入的数据都将丢失。如需持久化数据,则需要实现相关的文件读写操作。

三、拓展:地址簿程序拓展,如何实现在地址簿程序中持久化数据?

为了实现数据的持久化,通常需要将数据存储在文件或数据库中。在这个简单的地址簿程序的情况下,我们可以使用Python中的文件操作功能来存储和读取数据。我将示范如何通过json格式保存至文件,因为json文件易于读写,并且可以直接与Python的字典结构相互转换。

下面是如何实现地址簿数据持久化的步骤:

  1. 使用 JSON 文件存储数据

    导入json模块,并设置一个文件名变量用来保存地址簿数据。

  2. 保存数据到 JSON 文件

    在添加、编辑和删除联系人后,更新存储在文件中的数据。

  3. 从 JSON 文件加载数据

    程序启动时,尝试加载存储在文件中的数据到address_book字典中。

下面是修改后的代码,包括数据持久化的实现:

以下是一个包含了数据持久化的完整地址簿程序的代码。这个地址簿程序利用JSON文件存储和加载数据,允许在程序重新运行时保持数据。

python

import json# JSON文件名用于存储地址簿
address_book_filename = 'address_book.json'# 尝试从JSON文件加载地址簿,如果不存在则创建一个空字典
try:with open(address_book_filename, 'r') as file:address_book = json.load(file)
except FileNotFoundError:address_book = {}# 函数用来保存地址簿到JSON文件
def save_address_book():with open(address_book_filename, 'w') as file:json.dump(address_book, file, indent=4)# 添加联系人信息
def add_contact():name = input("输入联系人名字: ")email = input("输入联系人邮箱: ")phone = input("输入联系人电话: ")address_book[name] = {'Email': email,'Phone': phone}save_address_book()print(f"{name} 已添加到地址簿。")# 删除联系人信息
def delete_contact():name = input("输入要删除的联系人名字: ")if name in address_book:del address_book[name]save_address_book()print(f"{name} 已从地址簿中删除。")else:print(f"联系人 {name} 不存在在地址簿中。")# 查找联系人信息
def find_contact():name = input("输入你想查找的联系人名字: ")if name in address_book:email = address_book[name]['Email']phone = address_book[name]['Phone']print(f"联系人 {name} - 邮箱: {email}, 电话: {phone}")else:print(f"联系人 {name} 不存在在地址簿中。")# 编辑联系人信息
def edit_contact():name = input("输入你想编辑的联系人名字: ")if name in address_book:email = input(f"输入新的邮箱地址 (之前为 {address_book[name]['Email']}): ")phone = input(f"输入新的电话号码 (之前为 {address_book[name]['Phone']}): ")address_book[name] = {'Email': email,'Phone': phone}save_address_book()print(f"联系人 {name} 已更新。")else:print(f"联系人 {name} 不存在在地址簿中。")# 主函数,展示用户菜单并响应用户输入
def main():while True:print("\n地址簿程序")print("1. 添加联系人")print("2. 删除联系人")print("3. 查找联系人")print("4. 编辑联系人")print("5. 退出程序")choice = input("请输入操作编号: ")if choice == '1':add_contact()elif choice == '2':delete_contact()elif choice == '3':find_contact()elif choice == '4':edit_contact()elif choice == '5':print("退出地址簿程序。")breakelse:print("无效的输入, 请重新输入编号。")if __name__ == '__main__':main()

上面的程序使用了Python的内置json模块来进行数据的序列化和反序列化。address_book字典存储了用户的联系人信息,并在每次添加、删除或修改联系人后立即保存到同目录下的address_book.json文件中。程序启动时会尝试从这个文件加载数据,这样即使在程序关闭和重启之间,用户的数据也不会丢失。

确保你有适当的文件读写权限,以便程序能够正常创建和修改address_book.json文件。如果计划在生产环境中使用类似的程序,你可能需要更强大的数据存储解决方案,比如数据库系统,并且考虑额外的错误处理和数据保护措施。

四、拓展:地址簿程序拓展代码详细分析

上述地址簿程序是一个简单的命令行界面应用,它允许用户添加、删除、查找和编辑联系人。它使用JSON格式文件进行数据持久化。这里对代码各部分进行详细分析:

导入必要的模块:

python

import json

导入json模块,它用于读取和写入JSON格式的文件。

全局变量设置:

python

address_book_filename = 'address_book.json'

这定义了一个字符串变量address_book_filename,它保存存储地址簿数据的JSON文件的文件名。

尝试加载或初始化地址簿字典:

python

try:with open(address_book_filename, 'r') as file:address_book = json.load(file)
except FileNotFoundError:address_book = {}

在这段代码中,程序尝试打开名为address_book.json的文件并加载其内容到address_book字典中。如果文件不存在(抛出FileNotFoundError异常),则初始化address_book为一个空字典。

保存地址簿数据到文件的函数:

python

def save_address_book():with open(address_book_filename, 'w') as file:json.dump(address_book, file, indent=4)

该函数save_address_book使用上文定义的文件名变量address_book_filename,打开文件并以写的方式('w'),将address_book字典转换成JSON格式并保存下来。indent=4参数确保了JSON数据易于阅读。

添加、删除、查找和编辑联系人的功能函数:

  1. add_contact函数提示用户输入新联系人的相关信息,然后将它保存到address_book字典,并调用save_address_book函数写入JSON文件。

  2. delete_contact函数提示用户输入要删除的联系人名字,如果在字典找到此联系人,就从字典中将其删除,并通过save_address_book更新JSON文件。

  3. find_contact函数允许用户通过输入名字来找到特定联系人并显示其信息。

  4. edit_contact函数让用户通过输入名字来找到特定联系人并能够修改其信息,之后保存新的数据到文件中。

主函数(程序入口):

python

def main():while True:...if choice == '1':add_contact()elif choice == '2':delete_contact()...elif choice == '5':print("退出地址簿程序。")breakelse:print("无效的输入, 请重新输入编号。")

main函数包含了一个无限循环,显示菜单并根据用户的输入调用相应的函数。循环内部有一个条件判断语句(if-elif-else),用于根据用户的选择执行相应的功能。一旦用户选择退出(choice == '5'),循环将通过break语句终止,这也会结束程序。

程序运行检测:

python

if __name__ == '__main__':main()

这是一个Python的标准模式,用于判断当前脚本是否是直接运行而不是作为模块导入到别的脚本中。如果是直接运行,__name__变量的值将会是'__main__',让main函数被调用。

整个程序利用函数将不同的功能进行模块化处理,使得代码结构清晰,方便维护和扩展。利用JSON文件进行数据持久化是确保用户数据不会因程序关闭而丢失的简单有效方法。

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

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

相关文章

Vue3学习01 Vue3核心语法

Vue3学习 1. Vue3新的特性 2. 创建Vue3工程2.1 基于 vue-cli 创建项目文件说明 2.2 基于 vite 创建具体操作项目文件说明 2.3 简单案例(vite) 3. Vue3核心语法3.1 OptionsAPI 与 CompositionAPIOptions API 弊端Composition API 优势 ⭐3.2 setup小案例setup返回值setup 与 Opt…

【vue/uniapp】使用 smooth-signature 实现 h5 的横屏电子签名

通过github链接进行下载,然后代码参考如下,功能包含了清空、判断签名内容是否为空、生成png/jpg图片等。 签名效果: 预览效果: 下载 smooth-signature 链接:https://github.com/linjc/smooth-signature 代码参考&a…

nexus搭建maven与docker镜像的私有仓库

引言 通过nexus搭建maven与docker镜像的私有仓库,实现jar包与镜像动态更新、共享、存储。 一、nexus部署 通过docker-compose部署nexus name: java services:#############################环境#############################env-nexus:restart: always## 3.58.1image: so…

ANSYS 2024 R1 HFSS部分更新介绍(附下载)

1. 优化Layout component工作流 • 支持多区域 - 支持参数化弯曲定义的刚柔结合的PCB • Phi 网格可用 • 支持Mesh Fusion •简化创建复杂装配体的过程 2. 提升求解器速度 • 分布式矩阵汇编的内存使用率改进 ‐减少分布式矩阵求解器的RAM消耗 • 分布式稀疏直接求解器&am…

物联网实战--驱动篇之(六)4G通讯(Air780E)

目录 一、4G模块简介 二、AIR780E驱动程序 三、AIR780使用注意事项 四、结合MQTT传输测试 一、4G模块简介 4G应该是我们日常生活最常见的一种互联网通讯方式了,每个智能手机都配置了,不过手机的4G跟我们物联网领域要用的4G有点区别。首先是物联网采用…

芯来科技、IAR和MachineWare携手加速符合ASIL标准RISC-V汽车芯片创新

支持软件开发团队在虚拟硬件平台上进行固件和MCAL开发 芯来科技(Nuclei)、IAR和MachineWare紧密合作,加速RISC-V ASIL合规汽车解决方案的创新。此次合作简化了汽车电子的固件和MCAL开发,提供了虚拟和物理硬件平台之间的无缝集成。…

Harmony鸿蒙南向驱动开发-SDIO

SDIO(Secure Digital Input and Output)由SD卡发展而来,与SD卡统称为MMC(MultiMediaCard),二者使用相同的通信协议。SDIO接口兼容以前的SD卡,并且可以连接支持SDIO接口的其他设备。 运作机制 …

SpringBoot --pagehelper分页

目录 1.建立数据库 2.页面显示 3.基本逻辑 4.配置依赖 5.使用pagehelper 6.页面列表 页面 效果 1.建立数据库 create database if not exists my_book; use my_book; create table if not exists myBook (id int primary key auto_increment,name varchar(50) not …

Node.js常用快捷键

1.常用的终端命令: (1)del 文件名: 删除文件 (2)ipconfig: 查看IP命令 (3)mkdir 目录名 :在当前目录新建指定目录 (4)rd 目录名:在当前…

【opencv】示例-ela.cpp JPEG图像的错误等级分析(ELA) 通过分析图像压缩后的差异来检测图像是否被篡改过...

ela_modified.jpg 原始ela_modified压缩后再解压得到compressed_img 差异图像Ela 这段代码的功能是实现JPEG图像的错误等级分析(ELA),通过分析图像压缩后的差异来检测图像是否被篡改过。程序会首先读取一张图片,然后对其应用质量…

PHP自助建站系统,小白也能自己搭建网站

无需懂代码,用 自助建站 做企业官网就像做PPT一样简单,您可以亲自操刀做想要的效果! 自助建站是一款简单、快捷、高效的工具,可以帮助您制作响应式网站。我们的自助建站系统,将传统的编码工作转化为直观的拖拽操作和文…

Qt | 元对象系统

一、QByteArray 类简介 1、QByteArray 类简介  该类是一个用于处理字符串的类似于 C++的 string 类型的类,在 Qt 中,对字符串的处理,经常使用的是 QString 类,该类保证字符串以\0结尾,并使用隐式共享(copy-on-write)来减少内存用量和不必要的数据复制。  QByteArra…

Web3 的社会影响:数字社会的新时代

随着科技的不断进步和创新,人类社会正逐步进入数字化时代的新阶段。Web3 技术作为数字社会的重要组成部分,正在以前所未有的方式重塑着我们的社会生活和交往方式。本文将探讨 Web3 技术对社会的影响,以及它所带来的数字社会的新时代。 1. Web…

Gitlab全量迁移

Gitlab全量迁移 一、背景1.前提条件 一、背景 公司研发使用的Gitlab由于服务器下架需要迁移到新的Gitlab服务器上。Gitlab官方推荐了先备份然后再恢复的方法。个人采用官方的另外一种方法,就写这篇文章给需要的小伙伴参考。 源Gitlab: http://old.mygitlab.com #地…

数据应用OneID:ID-Mapping Spark GraphX实现

前言 说明 以用户实体为例,ID 类型包含 user_id 和 device_id。当然还有其他类型id。不同id可以获取到的阶段、生命周期均不相同。 device_id 生命周期通常指的是一个设备从首次被识别到不再活跃的整个时间段。 user_id是用户登录之后系统分配的唯一标识&#xff…

3D数据发布工具HOOPS Publish如何将3D模型转换成PDF格式?

在现代科技发展的推动下,3D技术在各个行业中扮演着越来越重要的角色。从工程设计到医疗保健,从建筑规划到教育培训,3D模型都成为了理解、沟通和展示复杂数据的主要工具。而将这些3D模型转换成PDF格式,能够使其更易于共享、存档和展…

配置交换机端口安全

1、实验目的 通过本实验可以掌握: 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…

nginx配置证书和私钥进行SSL通信验证

文章目录 一、背景1.1 秘钥和证书是两个东西吗?1.2 介绍下nginx配置文件中参数ssl_certificate和ssl_certificate_key1.3介绍下nginx支持的证书类型1.4 目前nginx支持哪种证书格式?1.5 nginx修改配置文件目前方式也会有所不同1.6 介绍下不通格式的证书哪…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.3 月末操作:外币评估

2.6.3 月末操作:外币评估 企业的外币业务在记账时一般使用期初的汇率或者即时汇率,但在月末,需要按照月末汇率对外币的余额或者未清项进行重估(revaluation)。 企业在资产负债表日,应当按照下列规…

【springboot开发】Gradle VS Maven

前言: java构建工具的主要作用是依赖管理和构建的生命周期管理。gradle和maven是目前java中最流行的两个构建工具,springboot常用maven,Android studio使用gradle。 目录 1. 简介2. Maven2.1 安装2.2 依赖管理2.3 构建生命周期管理 3. Gradle…