Python基础语法及文件操作后,通讯录实现之main函数与功能列表
"为何表情,要让这世界安排?"

我们对 python 的一些基础语法有了一定了解。在此基础上,我们学习了 python 中的文件操作。有了这些之后,我们能做些什么呢?对于很多数据结构的初学者而言,通讯录是他们展示所学知识的第一个舞台。那么,python 中的通讯录是如何实现的呢?
Python 是一种半编译半解释的语言,它没有严格的 main 函数。然而,当我们编写 C/C++、Java 等语言的程序时,第一步通常是实现一个 main 函数,因为这个 main 函数是程序启动的“入口”。
def menu():
print("添加一个新学生的信息。")
打印("2> 删除已存在的学生信息")
打印("3> 展示所有的信息")
print("4> Find a Stduent ")
print("0> For exit the Use ")
请输入你对于“Execute>”的选择,输入的内容将赋值给变量 choice 。
return choice
def main():
打印出('----------------------------------')
打印出“欢迎来到学生管理系统”。
print('----------------------------------')
#打印菜单信息
while True:
choice = menu()
if choice == '1':
#add
pass
elif choice =='2':
#delete
pass
elif choice =='3':
#show
pass
elif choice =='4':
#find
pass
elif choice =='0':
#exit process
输出:“学生管理系统关闭完成!”
else:
#输入错误
输出“错误输入,请重新尝试~”。
我们设计了 3 个通讯录的主功能,分别是“增”“删”“查”。每个功能的“pass”只是为了满足当前的编译需求,并没有实际的意义。
二、增加信息
我们需要为通讯录做一份协议,即学生信息的格式。
Students = []
def Insert():
打印("现在开始添加学生信息")
# 姓名 学号 性别 院系
请输入关于 ID 的信息,输入的内容将作为学生的 ID,即 student_id = input("Please Enter information for ID") 。
输入“Please Enter information for st_name”,将其赋值给 student_name 。
请输入关于“sexy”的信息。
请输入教师的相关信息。
#差错处理
如果学生的性别不在“男”和“女”之中:
打印("Student_Sexy 中输入错误")
return
#收集信息,整合成一个字典类型{}
student = {
"student_id" 等于 student_id 。
student_name 被用于指定特定的学生名称,它在相关上下文中起到标识该学生的作用。
'学生性感':学生性感。
'student_faculty': student_faculty 这个表述本身较为简洁和特定,难以进行非常大的改写且不改变原意。如果非要改写,可以这样:“'student_faculty' 指的就是 student_faculty 。”
}
#存入students
#如果要使用全局变量 最好先声明 再使用
global Students
Students.append(student)
打印出“信息保存成功”。
在使用 C 语言完成通讯录的过程中,为了确保通讯录具有动态性,我们选择了利用一块动态内存来开辟空间。
Data_Block 里面的数据或许是一个 struct st_Info{....}。在 Python 中,似乎无需像在 C 语言中管理数据的数组那样,向 heap 申请内存空间。而是使用列表[](类似于数组),不过它是动态开辟的,能够存储任何数据类型。我们使用的是全局边 Students ,它等于一个空列表。每一个 student 都是一个哈希结构的字典,其中包含着 key 与 value 。(后面会提及为什么这里选择字典结构。)在 python 中,这里所实现的用于存储学生信息的容器发生了变化。原本是动态数组(Data_Block),现在变成了列表(Students);原本是 struct 结构体(st_Info),现在变成了字典结构(student)。
第十一行的差错处理是有必要的。str1 not in('c1','c2')这种表达方式是 Python 特有的。它的作用是让 str1 在由('c1','c2')构成的列表序列中进行查找。如果 str1 存在于该列表序列中,就返回 True;如果不存在,就返回 False。
三、删除信息
def Delete():
#这里删除我们 选择根据student_id删除
请输入你想要删除的学生 ID,即输入“Please Enter st_ID you wanner to delete”中的内容。
for s in Students:
如果 s 中的“student_id”等于 StudentID
Students.remove(s)
打印出“成功删除信息”。
这里的 s 会依次从 Students 这个序列中取出每个对象。我们找到了设计这种字典结构的原因,这样就能很容易地辨别出哪个 s 是需要被删除的。
列表.remove(obj)的意思是在列表里把 obj 这个元素给删除掉。
四、打印与查找
我们期望以下打印格式:[姓名]、[学号]、[性别]、[院系]。
def Show():
for info in Students:
打印(info["student_faculty"])
打印(“显示信息的数量:”+str(len(Students)))
def Find():
我们在这里通过输入姓名来查找,所以难免会出现同名的情况。我们统一采取的处理方式是将其打印出来。
count = 0
输入你想要查找的姓名:name = input("> ")
for info in Students:
如果名字等于信息中的“学生姓名”:
打印(f"["+info["student_id"]+"]\t["+info["student_name"]+"]\t["+info["student_gender"]+"]\t,"+info["student_faculty"])
count += 1
输出“学生的总数:{count}”
测试:
那么我们的增删查实现的功能也完成了,我们来看看成果吧~
五、文件版本
此时我们的系统还存有两个人的信息,我们重新打开程序试试看。
我们没有发现任何数据。那么之前辛苦插入的数据去了哪里呢?我们都清楚,程序一旦开始运行,操作系统会通过调度把程序的代码读入内存,以便 CPU 能快速取指令去执行任务。一旦程序结束,原本应该分配给程序的空间,就会被“销毁”。你在运行时存储的数据,只是在内存中存储着,是容易丢失的。
那么什么数据是永久存储的呢?答案当然是磁盘!
我们想要的存入记事本的格式是这样的,以便读取。
def Save():
#将我们的数据存入磁盘
使用“w”模式以 utf-8 编码打开“DataSave.txt”文件,并将其赋值给变量 f 。
#写入文件
for info in Students:
输出("Save 的总数: {len(Students)}")
使用 open 上下文管理器,意味着我们无需手动去管理向系统申请的文件描述符,它会帮我们做好资源的回收管理工作。
有了save,那么一定有从磁盘文件中读取数据的步骤:
def Load():
有可能我是第一次打开更新这个管理系统吗?如果是这样,就不会存在 DataSave.txt。
如果不存在“DataSave.txt.”这个路径:
print("Nothing to Load")
return #也就不需要读取了
count = 0
global Students
#读文件
打开名为“DataSave.txt”的文件,以只读模式('r')打开,并且设置编码为“utf-8”,将其赋值给变量 f 。
# 因为我们是按照行存储的 那么读取数据也是按照行读取
for line in f:
#name id gender faculty\n
line = line.strip() #去掉传末尾\n
使用 '\t' 作为分隔符来切割字符串,将字符串 line 进行分割,分割后的结果存储在 tokens 中。
解析出来的格式通常包含四个部分,分别是 name、id、gender 和 faculty。
if len(tokens) != 4:
print("Wrong Parse format!")
return
#填充信息
student = {
“student_name”为 tokens 中的第一个元素。
“student_id”为 tokens 中的第一个元素。
“student_gender”为 tokens 中的第二个元素。
“student_faculty”指的是 tokens 中的第三个元素。
}
#插入总的序列容器中
Students.append(student)
count += 1
输出("总加载数量: {count}")
六、测试
我们需要在程序加载处Load之前存储的数据。
我们首先清空记事本,开是我们的录用信息之旅吧~
如我们所见,我们存入的信息能在磁盘上保存了。
程序退出:
当然如何退出我们的通讯录呢?我觉得点击最上面的红色方括号有些麻烦。系统 sys 提供了能够结束进程的函数,调用这个函数就可以了。
总结
如果你写过一套完整的纯 C 写的通讯录,那么你可以发现,后发展起来的语言舍弃了前者的一些不好之处,取用了其好的地方。在 Python 中,我们用可以存储任何数据类型且自动扩容的列表,替代了需要动态开辟的数组。我们还用 Python 的字典,替代了需要在.h 中定义的 strcut st_Info{}。我们可以使用 line = str.split('\t'),通过以'\t'进行分割操作,然后将返回的列表赋值给 line 。我们也使用 str.strip()来去除字符串末尾那些与数据读取无关的字符…… 只能说,“Life is short,you need Python”。
本篇就到此结束了,感谢你的阅读。
祝你好运,向阳而生~