Python基础语法及文件操作后,通讯录实现之main函数与功能列表

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

Python基础语法及文件操作后,通讯录实现之main函数与功能列表

我们对 python 的一些基础语法有了一定了解。在此基础上,我们学习了 python 中的文件操作。有了这些之后,我们能做些什么呢?对于很多数据结构的初学者而言,通讯录是他们展示所学知识的第一个舞台。那么,python 中的通讯录是如何实现的呢?

一、main函数与功能列表

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”。

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

祝你好运,向阳而生~

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读