闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下

?

接下来就按照这个流程实现各个模块的功能

1. 定义一个类,并初始化

def __init__(self):

with open("contact.txt", 'r', encoding='utf-8') as f:

self.data= json.loads(f.read()) #所有联系人列表

2. 接下来先定义一个方法,实现通讯录的主界面的功能

1 defmain_menu(self):2 #主菜单(主页面)

3 whileTrue:4 print('通讯录'.center(20, '='))5 menu = {'1': '快速查找',6 '2': '添加联系人',7 '3': '显示所有联系人'}8 for k, v inmenu.items():9 print(k + ' ' +v)10 command = input('请选择你的操作>>')11 if command == '1':12 self.search()13 elif command == '2':14 self.add_contact()15 elif command == '3':16 self.show()17 elif command == 'q':18 print('退出...')19 break

调用该方法,就会显示一个主界面,注:整个程序都有"返回”功能,操作命令是按"q"

?

用户可以选择"快速查找”(定义了一个search()方法来实现),"添加联系人”(定义了一个add_address()方法实现),"显示所有联系人”(定义了一个show()方法来实现),然后根据用户的输入如,进入下一个子页面

下面介绍这几个方法的具体实现过程

search()方法(通讯录查找)

1 defsearch(self):2 print('快速查找'.center(20, '='))3 #可以根据联系人名字查找,也可以根据电话号码查找

4 find_info = input('请输入查找信息>>')5 count =06 for i inrange(len(self.data)):7 if count >len(self.data):8 print('未找到该联系人')9 break

10 if find_info in self.data[i]['name']:11 self.person_info(self.data[i]) #若有该联系人,则进入联系人个人信息页

12 elif find_info in self.data[i]['phone_number']:13 self.person_info(self.data[i]) #若有该号码,则进入联系人个人信息页

14 else:15 pass

16 count += 1

该方法是根据用户的输入,查找到联系人之后,返回联系人信息。该方法提供两种查找的方法,一种是根据备注名来查找,一种是根据电话号码来查找,若找不到则提示用户未找到,找到则跳转到该联系人的个人信息页

?

上面这个方法里面嵌套了一个方法,person_info(),参数是查找到的联系人的个人信息。这个方法的功能是展示某个联系人的个人信息页面,具体实现的过程如下

1 defperson_info(self, info):2 #个人信息页

3 #find_info 是该联系人的信息字典

4 print('已为你找到:{}'.format(info['name']))5 menu = {'1': '查看个人信息', '2': '修改信息', '3': '删除联系人', '4': '呼叫联系人', '5': '呼叫记录'}6 whileTrue:7 print('个人信息页'.center(20, '='))8 for k, v inmenu.items():9 print(k + ' ' +v)10 command = input('请选择操作>>')11 if command == '1':12 print('姓名:{} 电话号码:{} 通话记录:{}'.format(info['name'],13 info['phone_number'], info['call_records']))14 elif command == '2':15 self.modify_info(info)16 elif command == '3':17 self.del_contact(info)18 break #删除联系人之后,该联系人的个人信息页就没了,所以就得跳回去

19 elif command == '4':20 self.call(info)21 elif command == '5':22 self.call_logs(info)23 elif command == 'q':24 print('返回...')25 break

如果正确进入该页的话,将会看到下面这个界面

?

然后用户可以根据提示,选择你接下来的操作。根据代码可以看到,从1到5,各个功能都分别定义了一个方法(函数)。下面来介绍一下这几个方法的实现过程

修改信息

1 defmodify_info(self, info):2 #修改联系人信息

3 #info是该联系人信息字典

4 if info inself.data:5 self.data.remove(info) #将所有联系人的列表中的该联系人删除,等修改好之后再后在重新加进去,然后更新通讯录

6 menu = {'1': '修改备注', '2': '修改号码', '3': '删除通话记录'}7 whileTrue:8 print('修改信息'.center(20, '='))9 for k, v inmenu.items():10 print(k + ' ' +v)11 command = input('请选择操作>>')12 if command == 'q':13 print('返回...')14 break

15 if command == '1':16 info['name'] = input('请输入备注>>')17 elif command == '2':18 info['phone_number'] = input('请输入号码>>')19 elif command == '3':20 info['call_records'] =[]21 else:22 continue

23 self.data.append(info) #将修改过的该联系人信息加入所有联系人信息列表,以待更新通讯录

24 #print(self.data)

25 self.update_contact() #更新通讯录

26 print('信息修改成功')

修改信息可以修改备注、号码、删除通话记录(因为通话记录可以是多条的,所以通话记录是一个列表,删除通话记录就是将该列表变成空列表)

?

删除联系人

1 defdel_contact(self, info):2 #删除联系人

3 try:4 self.data.remove(info)5 exceptException as e:6 print(e)7 self.update_contact()8 print('成功删除联系人: {}'.format(info['name']))

删除联系人之后,该联系人的个人信息页也就没意义,所以是删除成功就直接回到主页面

?

呼叫联系人

1 defcall(self, info):2 #呼叫联系人

3 print('呼叫{}'.format(info['name']).center(20, '='))4 print('通话中...')5 self.data.remove(info)6 start_time =time.time()7 now_time =time.ctime()8 input('按e挂断电话>>')9 end_time =time.time()10 pass_time = end_time -start_time11 info['call_records'].append(now_time+"通话时长:"+str(pass_time)) #将本次通话加入通话记录的列表中

12 self.data.append(info)13 self.update_contact()14 print('通话结束')

这儿方法很简单,就是记录开始时间start_time之后,提示用户随时可以结束通话(按e(end)挂断),然后通话结束之后,又会得到一个结束时间end_time,这样通话时长就可以得到了,通话时间就是拨号时的时间。

?

呼叫记录

1 defcall_logs(self, info):2 #通话记录

3 print('呼叫记录'.center(20, '='))4 with open('contact.txt', 'r', encoding='utf-8') as f:5 data_list =json.loads(f.read())6 for data indata_list:7 if data['name'] == info['name']:8 print(data['call_records'])9 break

10 else:11 continue

这个没什么好说的,就是读取通讯录信息,然后打印与该用户的的通话记录就可以了。

?

注意,上面的这些代码,牵扯到通讯录信息的增、删、改的,在操作完之后都要将信息重新写入一次,即模拟刷新通讯录,这个刷新通讯录的方法是update_contact(),代码如下

1 defupdate_contact(self):2 #刷新通讯录

3 with open('contact.txt', 'w', encoding='utf-8') as f:4 try:5 json.dump(self.data, f, ensure_ascii=False)6 exceptException as e:7 print('操作失败:%s' % e)

注,self.data 是通讯录里所有联系人的信息的一个列表,刷新通讯录实际上就是当self.data被修改之后,就重新将它写进通讯录,这样就实现了更新的功能。dump()里面的参数ensure_ascii=False的作用是让输入的中文写入时就是显示中文,而不是unicode编码。

主页面中的添加联系人

1 defadd_contact(self):2 #添加联系人

3 #print(self.data)

4 print('添加联系人'.center(20, '='))5 new_contact =dict()6 new_contact['name'] = input('请输入联系人备注>>')7 new_contact['phone_number'] = input('请输入号码>>')8 new_contact['call_records'] =[]9 self.data.append(new_contact)10 self.update_contact() #更新通讯录

11 print('成功添加联系人')

?

主页面中的显示全部联系人(如果不想慢慢查找,可以用这个方法实现显示所有联系人)

1 defshow(self):2 #显示所有联系人

3 print('所有联系人'.center(20, '='))4 contacts = {} #所有联系人的名字

5 for i inrange(len(self.data)):6 contacts[str(i)] = self.data[i]['name']7 print('{} {}'.format(str(i), self.data[i]['name']))8 command = input('请选择查看联系人>>')9 name =contacts[command]10 for data inself.data:11 if data['name'] ==name:12 self.person_info(data)13 else:14 continue

?

代码中读取文件的方式是用json模块

完整代码:

1 #--*-- coding:utf-8 --*--

2

3 importjson4 importtime5

6

7 classContact(object):8

9 data = "hello"

10

11 def __init__(self):12 with open("contact.txt", 'r', encoding='utf-8') as f:13 self.data = json.loads(f.read()) #所有联系人列表

14 #print(self.data, type(self.data))

15

16 defmain_menu(self):17 #主菜单(主页面)

18 whileTrue:19 print('通讯录'.center(20, '='))20 menu = {'1': '快速查找',21 '2': '添加联系人',22 '3': '显示所有联系人'}23 for k, v inmenu.items():24 print(k + ' ' +v)25 command = input('请选择你的操作>>')26 if command == '1':27 self.search()28 elif command == '2':29 self.add_contact()30 elif command == '3':31 self.show()32 elif command == 'q':33 print('退出...')34 break

35

36 defsearch(self):37 print('快速查找'.center(20, '='))38 #可以根据联系人名字查找,也可以根据电话号码查找

39 find_info = input('请输入查找信息>>')40 count =041 for i inrange(len(self.data)):42 if count >len(self.data):43 print('未找到该联系人')44 break

45 if find_info in self.data[i]['name']:46 self.person_info(self.data[i]) #若有该联系人,则进入联系人个人信息页

47 elif find_info in self.data[i]['phone_number']:48 self.person_info(self.data[i]) #若有该号码,则进入联系人个人信息页

49 else:50 pass

51 count += 1

52

53 defperson_info(self, info):54 #个人信息页

55 #find_info 是该联系人的信息字典

56 print('已为你找到:{}'.format(info['name']))57 menu = {'1': '查看个人信息', '2': '修改信息', '3': '删除联系人', '4': '呼叫联系人', '5': '呼叫记录'}58 whileTrue:59 print('个人信息页'.center(20, '='))60 for k, v inmenu.items():61 print(k + ' ' +v)62 command = input('请选择操作>>')63 if command == '1':64 print('姓名:{} 电话号码:{} 通话记录:{}'.format(info['name'],65 info['phone_number'], info['call_records']))66 elif command == '2':67 self.modify_info(info)68 elif command == '3':69 self.del_contact(info)70 break #删除联系人之后,该联系人的个人信息页就没了,所以就得跳回去

71 elif command == '4':72 self.call(info)73 elif command == '5':74 self.call_logs(info)75 elif command == 'q':76 print('返回...')77 break

78

79 defcall_logs(self, info):80 #通话记录

81 print('呼叫记录'.center(20, '='))82 with open('contact.txt', 'r', encoding='utf-8') as f:83 data_list =json.loads(f.read())84 for data indata_list:85 if data['name'] == info['name']:86 print(data['call_records'])87 break

88 else:89 continue

90

91 defcall(self, info):92 #呼叫联系人

93 print('呼叫{}'.format(info['name']).center(20, '='))94 print('通话中...')95 self.data.remove(info)96 start_time =time.time()97 now_time =time.ctime()98 input('按e挂断电话>>')99 end_time =time.time()100 pass_time = end_time -start_time101 info['call_records'].append(now_time+"通话时长:"+str(pass_time)) #将本次通话加入通话记录的列表中

102 self.data.append(info)103 self.update_contact()104 print('通话结束')105

106 defdel_contact(self, info):107 #删除联系人

108 try:109 self.data.remove(info)110 exceptException as e:111 print(e)112 self.update_contact()113 print('成功删除联系人: {}'.format(info['name']))114

115 defmodify_info(self, info):116 #修改联系人信息

117 #info是该联系人信息字典

118 if info inself.data:119 self.data.remove(info) #将所有联系人的列表中的该联系人删除,等修改好之后再后在重新加进去,然后更新通讯录

120 menu = {'1': '修改备注', '2': '修改号码', '3': '删除通话记录'}121 whileTrue:122 print('修改信息'.center(20, '='))123 for k, v inmenu.items():124 print(k + ' ' +v)125 command = input('请选择操作>>')126 if command == 'q':127 print('返回...')128 break

129 if command == '1':130 info['name'] = input('请输入备注>>')131 elif command == '2':132 info['phone_number'] = input('请输入号码>>')133 elif command == '3':134 info['call_records'] =[]135 else:136 continue

137 self.data.append(info) #将修改过的该联系人信息加入所有联系人信息列表,以待更新通讯录

138 #print(self.data)

139 self.update_contact() #更新通讯录

140 print('信息修改成功')141

142 defupdate_contact(self):143 #刷新通讯录

144 with open('contact.txt', 'w', encoding='utf-8') as f:145 try:146 json.dump(self.data, f, ensure_ascii=False)147 exceptException as e:148 print('操作失败:%s' %e)149

150 defadd_contact(self):151 #添加联系人

152 #print(self.data)

153 print('添加联系人'.center(20, '='))154 new_contact =dict()155 new_contact['name'] = input('请输入联系人备注>>')156 new_contact['phone_number'] = input('请输入号码>>')157 new_contact['call_records'] =[]158 self.data.append(new_contact)159 self.update_contact() #更新通讯录

160 print('成功添加联系人')161

162 defshow(self):163 #显示所有联系人

164 print('所有联系人'.center(20, '='))165 contacts = {} #所有联系人的名字

166 for i inrange(len(self.data)):167 contacts[str(i)] = self.data[i]['name']168 print('{} {}'.format(str(i), self.data[i]['name']))169 command = input('请选择查看联系人>>')170 name =contacts[command]171 for data inself.data:172 if data['name'] ==name:173 self.person_info(data)174 else:175 continue

176

177

178 if __name__ == '__main__':179 a1 =Contact()180 a1.main_menu()

编写一个简单的通讯录python-python写一个通讯录相关推荐

  1. 通过as写一个简单的按键_自己写一个简单的二维魔方游戏

    周日下午一口气刷了4集<最强大脑>,很久不看综艺,发现这个节目还挺有意思的,清北这些大佬确实有过人之处.在看视频过程中印象最深的一幕莫过于北大王心冉对阵清华张洗月,她们比的题目是盲拧一个二 ...

  2. 用java做一个简单记事本_用记事本写一个简单的java程序

    用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...

  3. python实现一个整数加法计算器_如何使用python编程写一个加法计算器-Python教程...

    一.关上idle.点击file,而后点击new file.这是创立一个新的文件. 新建一个文件之后,咱们输出第一行代码,应用print函数,正在屏幕上打印一句话,此中字符串要应用双引号,输出法要应用英 ...

  4. python restful api_用Python语言写一个restful API

    本文主要向大家介绍了用Python语言写一个restful API,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. """ package.modul ...

  5. 30分钟用python+pyechart写一个近期深圳的疫情地点展示

    @[TOC]30分钟用python+pyechart写一个近期深圳的疫情地点展示 背景 最近(今天20220227),深圳的–疫--情–又严重起来了.深圳卫健委天天都有在发病例XX,居住XX,只看地址 ...

  6. Python来写一个童话故事

    Python来写一个童话故事 主题:冒险, 风格:惊险, 人物:男孩, 地点:海底. 循环遍历鱼列表中的每一条鱼 for fish in fishes:# 获取男孩和鱼的坐标和距离boy_x, boy ...

  7. 简单的面向对象思想,写一个传奇人物的属性

    简单的面向对象思想,写一个传奇人物的属性 package com.hz.game;import java.util.Random;/*** //hat,weapon,necklace,ring,clo ...

  8. python解释器用什么写的_用 Python 从零开始写一个简单的解释器(3)

    到目前为止,我们已经为解释器写了一个词法分析器和 一个解析器组合子库.在这里,我们会创建抽象语法树(AST)的数据结构,使用组合子库写一个解析器,组合子库可以实现将词法分析器返回的标记列表转换为一个抽 ...

  9. 用python做一个简单的游戏,用python写一个小游戏

    大家好,本文将围绕如何用python做一个简单的小游戏展开说明,python编写的入门简单小游戏是一个很多人都想弄明白的事情,想搞清楚用python做一个简单的游戏需要先了解以下几个事情. 1.Pyt ...

  10. python关于通讯录模型_python写一个通讯录 - wtwexile - 博客园

    python写一个通讯录 闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下 接下来就按照这个流程实现各个模块的功能 1. 定义一个类,并初始化 1 import j ...

最新文章

  1. Docker 上传镜像amp;拉取镜像
  2. Windows服务安装、卸载方法,卸载后在服务列表中仍显示问题,指定的服务已经标记为删除
  3. [shell进阶]——shell多线程
  4. C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)
  5. 如何把网址配置为http和https可以同时访问
  6. 自动优化工具Black帮你写出规范漂亮的python代码
  7. abd.exe 需要下java吗_abd.exe
  8. python后台架构Django教程——连接读写mysql数据库
  9. 苹果mac屏幕截图工具:Snagit
  10. testbench文件显示波形_如何编写testbench的总结(非常实用的总结)
  11. 解决AndroidStudio中使用.9图片不生效的问题
  12. Excel批量设置数字转化成“以文本形式存储的数字”
  13. 微信开发者工具 Source Map 的使用
  14. Ubuntu查看系统的各种版本信息
  15. could not locate named parameter [***]; nested exception is org.hibernate.QueryParameterException: c
  16. 计算机二级考试是考什么?
  17. JAVA:(拉丁正方形)
  18. 数据指标拆解(一)社区团购--美团优选
  19. Keras CIFAR-10彩色图像物体识别 卷积神经网络
  20. Skipping MapperFactoryBean with name ‘xxxMapper‘ and ‘xxx.xxx.xxx.mapper.xxxxxMapper‘ nterface. Bean

热门文章

  1. 闪电动画模拟(Dielectric Breakdown Model)附源码
  2. EasyUI DataGird底部统计行
  3. 为何品牌一定要做好控价
  4. 边缘计算书籍推荐丨文末赠书
  5. Vue组件keepAlive实现返回上一页保存原数据
  6. OSChina 周六乱弹 —— 放假前期焦虑症晚期
  7. Java生成UUID的常用方式
  8. uniApp配置微信分享 uniApp跳转微信小程序
  9. 数据结构——二叉树遍历原理及方法
  10. 人社高级工计算机论述题,[精品]计算机高级维修工考试论述题