Python实现的通讯录

news/2024/5/20 23:01:39/文章来源:https://blog.csdn.net/RNGWGzZs/article/details/128927497

"为何表情,要让这世界安排?"

诶,我们也对python的一些基础语法有了一定能的了解了。并且在这基础上,学习了python中的文件操作,那么有了这些东西以后啊,我们能做什么呢?或许对很多数据结构的初学者来说,通讯录是他们第一个可以展示他们所习得知识的舞台。那么python中的通讯录,是怎样实现的呢?

一、main函数与功能列表

python属于是一种半编译半解释的语言,没有严格的main函数。但是,我们写C/C++,Java等语言写一个程序时,第一步往往都是是实现好一个main函数,因为那是程序启动的"入口"。

def menu():print("1> Add a new students's information ")print("2> Delete a existed Students' information ")print("3> Show all of information ")print("4> Find a Stduent ")print("0> For exit the Use ")choice = input("Please Enter your choice for Execute> ")return choicedef main():print('----------------------------------')print('             欢迎来到学生管理系统               ')print('----------------------------------')#打印菜单信息while True:choice = menu()if choice == '1':#addpasselif choice =='2': #deletepasselif choice =='3':#showpasselif choice =='4':#findpasselif choice =='0':#exit processprint("Students'management System close done!")else:#输入错误print("Wrong Input,Please Try Again~")

我们设计3个通讯录的主功能,"增删查"。每个功能的pass是为了现在编译能过,没啥实际意义。

二、增加信息

我们需要为通讯录做一份协议,即学生信息的格式。

Students = []
def Insert():print("Now for Add Students' information")# 姓名 学号 性别 院系student_id = input("Please Enter information for ID")student_name = input("Please Enter information for st_name")student_sexy = input("Please Enter information for sexy")student_faculty = input("Please Enter information for faculty")#差错处理if student_sexy not in ('男','女'):print("Wrong Input in Student_Sexy")return#收集信息,整合成一个字典类型{}student = {'student_id':student_id,'student_name':student_name,'student_sexy':student_sexy,'student_faculty':student_faculty}#存入students#如果要使用全局变量 最好先声明 再使用global StudentsStudents.append(student)print("Success in Saving information")

用C语言完成通讯录时,为了保证其的动态性~我们选择使用一块动态内存开辟的空间。

如:Data_Block,而里面的数据 或许是一个struct st_Info{ .... }Data_Block[st_Info]。在pyhton中,似乎不需要像C语言管理数据的数组一样,像heap申请内存空间。而是用列表[](类似数组一样),但是它是动态开辟的,可以存储任何数据类型。如我们使用的全局边Students = []。每个student是一个哈希结构的字典,key:value(当然为什么这里选择字典结构呢?后面会提及)。因此,在python中,这里实现的存储学生信息的容器从动态数组(Data_Block)变为了列表(Students),从struct结构体(st_Info)变为了字典结构(student)。

第十一行的差错处理是有必要的,str1 not in('c1','c2'),是python特有的表达方式,是让str1去由('c1','c2')构成的列表序列查找,如果存在返回True,否则返回False。

三、删除信息

def Delete():#这里删除我们 选择根据student_id删除StudentID = input("Please Enter st_ID you wanner to delete")for s in Students:if s['student_id'] == StudentID:Students.remove(s)print("Sucess in deleting Information")

这里的s会在Students这个序列里去取里面的每个对象。这里我们设计的字典结构的原因找到了,我们可以很轻松地甄别到哪个s才是 要被删除的。

列表.remove(obj):指的是在列表中删除obj元素。

四、打印与查找

打印格式,我们希望[姓名] \t [学号] \t [性别]\t [院系]\t

def Show():for info in Students:print(f"[{info['student_name']}]\t[{info['student_id']}]\t[{info['student_gender']}]\t{info['student_faculty']}")print(f"Show the number of Information:{len(Students)}")def Find():#我们这里输入姓名查找因此 不免会有同名的现象。我们统一做的处理是打印出出来count = 0name = input("Please Enter Name you wanner to find> ")for info in Students:if name == info['student_name']:print(f"[{info['student_id']}]\t[{info['student_name']}]\t[{info['student_gender']}]\t,[{info['student_faculty']}]")count += 1print(f"Total of the Students: {count}")

测试:

那么我们的增删查实现的功能也完成了,我们来看看成果吧~

五、文件版本

此时我们的系统还存有两个人的信息,我们重新打开程序试试看。

我们发现没有任何数据??? 那么之前辛辛苦苦插入的数据去哪里了呢?我们都知道,程序一旦运行起来,OS通过调度将程序的代码读进内存,以供cpu快速取指令执行任务。一旦程序结束,那么本来该分配给程序的空间,也就被"销毁"。你运行时存储的数据,无非是在内存中存储的,是易失性的。

那么什么数据是永久存储的呢?答案当然是磁盘!

我们想要的存入记事本的格式是这样的,以便读取。

def Save():#将我们的数据存入磁盘with open('DataSave.txt','w',encoding = 'utf-8') as f :#写入文件for info in Students:f.wirte(f"{info['student_name']}\t{info['student_id']}\t{info['student_gender']}\t{info['student_faculty']}\n")print(f"Total for Save: {len(Students)}")

with open上下文管理器,等于说我们可以不需要手动管理想系统申请的文件描述符,它会帮我们进行资源的回收管理。

有了save,那么一定有从磁盘文件中读取数据的步骤:

def Load():#有没有可能 我是第一次打开更新这个管理系统?那么就不会存在DataSave.txtif not os.path.exists('DataSave.txt.'):print("Nothing to Load")return #也就不需要读取了count = 0global Students#读文件with open('DataSave.txt','r',encoding='utf-8') as f:# 因为我们是按照行存储的 那么读取数据也是按照行读取for line in f:#name   id  gender  faculty\nline = line.strip() #去掉传末尾\ntokens = line.split('\t')#以'\t'作为分隔符 切割字符串#解析出来的格式一定有四个(name,id,gender,faculty)if len(tokens) != 4:print("Wrong Parse format!")return#填充信息student = {'student_name':tokens[0],'student_id':tokens[1],'student_gender':tokens[2],'student_faculty':tokens[3]}#插入总的序列容器中Students.append(student)count += 1print(f"Total Load num: {count}")

六、测试

我们需要在程序加载处Load之前存储的数据。

我们首先清空记事本,开是我们的录用信息之旅吧~

如我们所见,我们存入的信息能在磁盘上保存了。

程序退出:

当然怎么退出我们的通讯录呢,我想点最上面的红色方括号有些挫。系统sys提供了结束进程的函数,调用即可。

总结

其实可以看见,如果你写过一套完整的纯C写的通讯录,你就会发现后发展起来的语言,对于前者的一些不好地方的舍弃,好的地方的取用。我们在python中用可以存储任何数据类型、自动扩容的列表,替代了需要动态开辟的数组。我们用python的字典,替代了需要在.h中定义的strcut st_Info{}。我们可以使用line = str.split('\t'),以'\t'分割切开,返回一个列表赋值给line,我们同样使用str.strip()去掉字符串末尾与数据读取无关紧要字符…… 只能说,"Life is short,you need Python"

本篇就到此结束了,感谢你的阅读。

祝你好运,向阳而生~

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

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

相关文章

揭秘PPTC(自恢复保险丝)的四大使用原则

PPTC自恢复保险丝有贴片式以及插件式两种,封装形式多样,型号齐全,那么,在使用过程中,应该要注意什么?你知道吗?接下来,优恩小编将为你揭秘PPTC(自恢复保险丝)的四大使用原则。一、规…

Spring boot项目开发实战一(环境搭建)

技术栈选型 最近在实习好久没时间做过项目了,本次将借用公司的技术完成一个基于spring boot的实战项目,同时也巩固spring的相关知识。项目大体是一个后台管理系统,没有前台,用于数据分析和可视化。如下是初步的可视化界面&#x…

MySQL8.0 集群搭建

文章目录环境准备安装 MySQL 8.0配置主服务配置从服务器主从复制:即主服务器上的所有操作(创建库,修改表等)会被同步到从服务器上,但是在从服务器上的操作不会进入到主服务器中 环境准备 两台服务器,一主…

【Classical Network】Xception

文章目录深度可分离卷积Inception发展GoogleNetInception Networkinception V1inception V2inception V3inception V4Xception参考文章 经典卷积架构的PyTorch实现:Xception 参考文章 卷积神经网络结构简述(二)Inception系列网络 github 项目…

Springboot扩展点之InstantiationAwareBeanPostProcessor

前言前面介绍了Springboot的扩展点之BeanPostProcessor,再来介绍另一个扩展点InstantiationAwareBeanPostProcessor就容易多了。因为InstantiationAwareBeanPostProcessor也属于Bean级的后置处理器,还继于BeanPostProcessor,因此Instantiatio…

【Spring Cloud Alibaba】(二)微服务调用组件Feign原理+实战

系列目录 【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战 本文目录系列目录前言什么是RPC?Feign和OpenFeign都是什么?HTTP调用 vs Feign(RPC)调用单独使用Feign实战Feign核心源码解读Feign整体设计架构Spring Clo…

PyQt5学习 阶段一

前言:PyQt5介绍PyQt是基于Digia公司强大的图形程序框架Qt的Python接口,由一组Python模块构成,它是一个创建GUI应用程序的工具包,由Phil Thompson开发。PyQt5的基本类:官方提供的帮助网址:https://www.river…

每天10个前端小知识 【Day 8】

前端面试基础知识题 1. Javascript中如何实现函数缓存?函数缓存有哪些应用场景? 函数缓存,就是将函数运算过的结果进行缓存。本质上就是用空间(缓存存储)换时间(计算过程), 常用于…

macbook M1 Homebrew配置导致本机的Kafka启动失效

笔者想在macbook M1上通过Homebrew安装Kafka 整体流程为: 安装kafka brew install kafka 启动zookeeper brew services start kafka启动kafka brew services start kafka启动provider,创建一个jxztest的主题 kafka-console-producer --bootstrap-server…

金仓数据库物理备份和还原

物理备份和还原 物理备份指的是将数据库中的相关物理文件转存储到指定的备份文件中,KES支持sys_rman、sys_basebackup、cp等多种物理备份方法。 一、物理备份类型 1、冷备 (1)冷备也叫文件系统级别备份。 (2)备份时…

3D设计师的激情吐槽 我与甲方爸爸不得不说的故事

苦逼的玉树临风的设计师们, 总是会熬夜加班受尽甲方爸爸的 折磨 宠爱~ 每每这一刻我都想深情地问一句, 设计师们,你们还好吗?今天就让我来带着你们, 重温这些 噩梦 温情时刻吧! - 1 - 他, 那个自…

02-linux用户和权限-04-生产环境linux服务器权限控制实例

文章目录1. 权限规划1.1 root 组1.2 docker组1.3 运维组1.3.1 项目运维负责人1.3.2 高级运维人员1.3.3 初级运维人员1.4 开发组1.4.1 开发负责人1.4.1 开发人员2. 实施2.1 deploy用户2.2 创建运维组2.2 创建开发组2.4 修改sudo权限1. 权限规划 1.1 root 组 用户名&#xff1a…

linux 批量创建用户 具有root 功能,创建普通用户

很遗憾,linux 系统只允许有一个root 用户,是不能多个root 用户的。但是可以有root权限此例子创建5个linux 普通用户 ,然后都分别都可以使用sudo 权限来使用root 权限。groupadd tempuser #创建一个用户组 名字叫:tempuser useradd…

微架构优劣势对比:单体应用、SOA、微服务

目前大部分的企业系统和互联网应用都是采用的Web形式提供服务能力,根据系统的组织和部署结构,软件架构的演化过程大概分成以下阶段:1、单体架构 2、SOA架构3、微服务架构 这也是软件架构从简单到复杂的演进过程,但正如业界常说的…

复试数据库篇[第2章关系数据库]

文章目录第二章 关系数据库2.1关系数据结构及形式化定义2.1.1关系2.1.2 关系模式2.2 关系操作2.2.1 基本的关系操作2.2.2 关系数据语言的分类2.3 关系的完整性2.3.1 实体完整性2.3.2 参照完整性2.3.3 用户定义的完整性2.4 关系代数2.4.1 传统的集合运算2.4.2 专门的关系运算2.5…

为什么写计算机SCI论文一定要看文献? - 易智编译EaseEditing

阅读文献的目的有两个主要目的:一是了解世界上本专业领域的内容和发展情况; 二是在了解过程中,产生自己的idea,进入这个领域。 什么是idea?怎么样产生?idea一般是在阅读文章的过程中产生的,给出三种比较简单产生ide…

Java IO PrintStream,PrintWrite

PrintStream 首先我们常用的静态方法System.out.print()就是一个典型的PrintStream ,请看如下代码证明 import java.io.*; public class Main {public static void main(String[] args) throws IOException ,ClassNotFoundException{ // 得到printStreamPr…

Minecraft 1.19.2 Fabric模组开发 12.自定义鞘翅

本次我们在Fabric模组中实现一个可用于飞行的鞘翅。 1.首先参考3D动画盔甲的教程一、二步制作盔甲的模型、动画文件。 2.模型制作完成,接下来需要制作我们的盔甲类 在items包中新建armor包 -> armor包中新建我们的套装类DressArmorItem.java DressArmorItem.j…

使用命令行更改Oracle字符集

查看字符集SQL:select * from v$nls_parameters;更改为UTF-8:sqlplus /nologconn / as sysdbaSHUTDOWN IMMEDIATE;STARTUP MOUNT EXCLUSIVE;ALTER SYSTEM ENABLE RESTRICTED SESSION;ALTER SYSTEM SET JOB_QUEUE_PROCESSES0;ALTER SYSTEM SET AQ_TM_PROCESSES0;ALTER DATABASE …

优思学院|管理体系你就只知道ISO?太落伍了!

相信大部分质量行业的小伙伴都知道 ISO 就是 International Organization for Standardization。ISO 管理体系是一组国际标准,为企业和组织提供了一种统一的方法来评估、证明和改进企业的管理过程。目前,最常用的 ISO 管理体系标准是ISO 9001:2015质量管…