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

目录

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

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

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

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


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

下面是一个简易的命令行地址簿程序的代码,编写于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.mzph.cn/news/799421.shtml

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

相关文章

SQL Sever 2008 安装教程

先从官网下载程序:下载地址 打开上述链接后,点击下载按钮。 就会跳出下面这个界面,如果你的电脑是64位的请选择下图中这两个程序。 下载完成后,在电脑磁盘中找到这两个文件,注意安装的顺序,先安装 SQLEXPR…

Linux:软硬链接及动静态库

一、Linux中的链接文件 1.1硬链接及应用场景 ln//创建硬链接 我们再创建一个硬链接生成的文件。 我们可以看到mlink.hard的inode和makefile.c的inode都是一样的,inode一样里面的数据自然也是一样。相当于对make.file进行了一个重命名,所以硬链接一定没…

2023年蓝桥杯省赛——买二赠一

目录 题目链接:1.买二赠一 - 蓝桥云课 (lanqiao.cn) 题目描述 输入格式 输出格式 样例输入 样例输出 样例说明 思路 队列贪心 代码实现 总结 题目链接:1.买二赠一 - 蓝桥云课 (lanqiao.cn) 题目描述 某商场有 N 件商品,其中第 i 件…

漫谈:“标准”是一种幻觉 C++语言标准的意义

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 “标准”这个词很迷惑&#xf…

基于SpringBoot注入Bean形式的监听(端口)

起一个线程、监听对应的端口,注入到容器 package com.port.component;import com.port.service.PortListenerService; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.stereoty…

铸铁平台的单围和双围是什么——北重机械

铸铁平台的单围和双围是指平台的围栏结构。单围指平台只有一面围栏,通常用于平台的三个边界上,另一边是与建筑物相连的。双围指平台两侧围栏都有,即平台四个边界都有围栏。双围结构比单围结构更加安全,可以防止人员和物品从平台四…

CleanmyMac 苹果电脑清理软件,为你的 Mac 提速!

Apple Macbook 已成为当今职场不可或缺的高效助手,尤其在普遍的远程办公场景下,其运行流畅度对工作效率及用户体验至关重要。虽然长期使用会使Mac电脑性能自然衰退,但大部分导致系统变慢的因素其实可经由用户自行调整得到显著改善&#xff0c…

linux 设置命令输入行高亮(与软件无关:xshell等)

在命令执行后输出内容比较多的情况下,很难查看自己的历史命令 这个配置是系统的配置:取消.bashrc文件中force_color_prompt=yes的注释即可 (和连接服务器的软件无关) 具体的操作如下: 执行以下命令,查看配置所在的行数root@hecs-166280:~# cat .bashrc -n | grep force_…

Java Lambda 表达式(详细)

Java Lambda 表达式 Lambda 的发展史 Java Lambda 表达式是在 Java 8 版本中引入的重要特性,它描述了一种更简洁、更灵活的方式来处理函数式编程。 在 Java 8 之前,要实现函数式编程,需要通过匿名类实现接口的方式。这样的代码通常比较冗长…

深入MyBatis的动态SQL:概念、特性与实例解析

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO,即普通的 Java 对象为数据库中的记…

MacOS Docker 部署 Redis 数据库

一、简介 Redis是一个开源的、使用C语言编写的、基于内存亦可持久化的Key-Value数据库,它提供了多种语言的API,并支持网络交互。Redis的数据存储在内存中,因此其读写速度非常快,每秒可以处理超过10万次读写操作,是已知…

milvus search api的数据结构

search api的数据结构 此api的功能是向量相似度搜索(vector similarity search) 一个完整的search例子: 服务端collection是一个hnsw类型的索引。 import random from pymilvus import (connections,Collection, )dim 128if __name__ __main__:connections.connect(alias…

VUE 实现路由的基本原理

路由 基本概念 在前端技术早期,所有页面的跳转通过更改url,浏览器页面刷新获取新的页面内容,这种粗糙的交互方式,一直等待优化。 后来,改变发生了——Ajax 出现了,它允许人们在不刷新页面的情况下发起请求&#xff0…

Django检测到会话cookie中缺少HttpOnly属性手工复现

一、漏洞复现 会话cookie中缺少HttpOnly属性会导致攻击者可以通过程序(JS脚本等)获取到用户的cookie信息,造成用户cookie信息泄露,增加攻击者的跨站脚本攻击威胁。 第一步:复制URL:http://192.168.43.219在浏览器打开,…

17、子矩阵的和(含源码)

子矩阵的和 题目描述 输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1, y1, x2, y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数n,m&…

基于java JSP 实现的固定资产管理系统

开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea 系统展示 前台首页功能模块 固…

1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet

1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet 前情回顾:1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet VGGNet出现在2014年的ILSVRC上,单个模型就将图像分类任务的Top-5错误率降低到8.0%;如果采用多…

Spring: 后端状态码如何与http状态码保持一致

文章目录 一、背景二、解决方案 一、背景 今天使用postman在做接口测试的时候发现了一个有趣的问题:响应体的status和http的status一样,出于好奇对该现象进行了总结。 二、解决方案 通过拦截器ResponseBodyAdvice,做到统一拦截 Controll…

day03 51单片机

51单片机学习 1 模块化编程 1.1 什么是模块化编程 随着我们的代码越来越复杂,我们的main.c越来越长,阅读性也越来越差。如果将来开始做项目,我们可能要同时操作好几个模块,这种情况下我们无法再把代码写到同一个文件,而是要分模块管理代码。 具体实现方法,就是将源码…

WPF —— 后台实现fromto动画实例

标签页 <Button Width"100"Height"40"Content"点击开始动画"Click"Button_Click"Name"b1"> </Button><!--HorizontalAlignment"Left"--><!--VerticalAlignment"Top添加这俩个属性的目…