![](http://dingyue.ws.126.net/2023/0121/107dbfefj00rottzq00apd000v900hkp.jpg)
要想用前面学的知识点,完成一个文字版的学生通讯录管理终端,我们可以从用户的角度出发。
菜单
![](http://dingyue.ws.126.net/2023/0121/7f476ad8j00rotp7v000wd0009d0092p.jpg)
不管任何软件,都需要给用户一个指引,或者待操作的方向。没错,那就是菜单。为了后续的调用,我们把显示菜单的代码封装为一个函数。
![](http://dingyue.ws.126.net/2023/0121/dbbbebf6j00rotp7v000kd000az0097p.jpg)
如果觉得上下的横线分隔太长,可以适当的缩短。
获取用户输入
![](http://dingyue.ws.126.net/2023/0121/27195612j00rotph10010d000jc00atp.jpg)
完成这个之后,就该接收用户的输入了。这里一定要注意,只能输入整数,要不然程序会崩溃的。
分支管理
![](http://dingyue.ws.126.net/2023/0121/25a887edj00rotpt70021d000c200cap.jpg)
得到用户输入的选项后,我们用if-else语句来完成不同的操作。除了可供选择的七个数字,其他全部让用户重新输入。
![](http://dingyue.ws.126.net/2023/0121/24743e61j00rotpvj000kd0008e00acp.jpg)
为了程序不出错,我们把所有的选项用print提示出来。
退出
![](http://dingyue.ws.126.net/2023/0121/bced8a16j00rotq5i0027d000cr00f4p.jpg)
既然输错了要重新输入,也不知道重新的次数,这个时候,就用到了while语句,来完成无限死循环了。设立死循环之前,一定要给它一个退出循环的出口。
![](http://dingyue.ws.126.net/2023/0121/a821bce8j00rotq5y000kd0008m00ajp.jpg)
我们可以把第6个选项退出加一个break语句来实现。
关于
![](http://dingyue.ws.126.net/2023/0121/2c8a26ffj00rotqgg000ld0009v0057p.jpg)
基于第七个选项也是比较简单的,也可以先完成。
![](http://dingyue.ws.126.net/2023/0121/cb1c8889j00rotqgq001fd000in00bfp.jpg)
基于美观考虑,在函数定义的尾部,添加了一个空的字符串,作为换行使用。
增加
![](http://dingyue.ws.126.net/2023/0121/ce447222j00rotr3b001vd000eq00dtp.jpg)
设立一个全局列表变量,作为存储所有学生信息的集合。而每个学生的信息,是以字典的形式存储,为简便起见,只获取学生的名字,年龄和电话等,每次获取完,以字典的数据类型作为列表的一个元素被添加到里面。
![](http://dingyue.ws.126.net/2023/0121/2cfbd35dj00rotrgz001dd000jh009rp.jpg)
因为输入没有什么限制,输入什么都是会被接受的。输出用户输入的当次的添加信息只是为了提示看输入了什么,正常情况下是没有的。
显示所有
![](http://dingyue.ws.126.net/2023/0121/e042a161p00rots01000ad000hf002mp.png)
为了能够知道输入的学生信息,就需要把选项5先完成。我们是用列表把所有的学生信息存储,所有显示所有,就意味着遍历循环列表所有的元素。
![](http://dingyue.ws.126.net/2023/0121/e11ecbcdj00rots21001cd000iy009tp.jpg)
因为没有把数据存储在外部,当程序结束后,之前输入的内容就消失了。需要先输入,再显示。当我们发现输入错误的时候,就需要修改数据内容了。
修改
![](http://dingyue.ws.126.net/2023/0121/5fa0f93fj00rotsm80017d000dh008lp.jpg)
修改数据前,是要先查询到学生列表中是否有这个名字的元素,如果有,就修改,没有提示用户。
![](http://dingyue.ws.126.net/2023/0121/baef85c2j00rotsm8000pd000df00dtp.jpg)
上图提示用户的错误已经更正,在后续完整代码那可以看出来。
查询
![](http://dingyue.ws.126.net/2023/0121/8fc3864fj00rott0e000sd000i7005qp.jpg)
既然修改前要查询,那么查询的选项也就好写了,而且还不用修改,把查询到的学生信息告知用户即可,查询到后便结束循环。该代码在增加时没有做重名检查,当前学生列表如果有两个名字一样的学生,会找到第一个。
![](http://dingyue.ws.126.net/2023/0121/f8295de7j00rott0q001md000hm00etp.jpg)
如果当前元素不是要查询的姓名,那就继续下一个,如果全部查询完,都不符合,提示用户没有。
删除
![](http://dingyue.ws.126.net/2023/0121/6e70d7edj00rottj2000xd000bu0077p.jpg)
前面提到重名时,会找到第一个,删除学生信息时,也是。
![](http://dingyue.ws.126.net/2023/0121/7d06114bj00rottjf001nd000v90090p.jpg)
删除时,是把整个列表的元素删除,也就是字典的三个元素,学生的三个不同属性。
不管是删除,查询,修改和显示全部,都用到for的遍历循环,这一点请重点关注。
完整代码
![](http://dingyue.ws.126.net/2023/0121/24360446j00rottsd002bd000ds00gwp.jpg)
![](http://dingyue.ws.126.net/2023/0121/203943bfj00rottsd002dd000d500h6p.jpg)
![](http://dingyue.ws.126.net/2023/0121/0482cccbj00rottse0025d000hw00h4p.jpg)
![](http://dingyue.ws.126.net/2023/0121/4b745347j00rottsd001yd000cb00gdp.jpg)
PS:本文代码基于Windows 10,Python 3.10.4。
![](http://dingyue.ws.126.net/2023/0121/cf7f13bcj00rotop30042d000zk00b8p.jpg)
热门跟贴