学习python模拟的名片管理系统代码优化
学习python做简单的增删改查,还按老规矩先把架构搭建起来,做了基本的功能,因为是初学者,所以不可避免要经历其他初学者一样的错误,经过许多次的报错调试,终于做出第一版代码,虽然很粗糙,但是还是有那么一点点自喜,以前接触过代码,大都是抄别人的,网上做好的拿过来分析,如果有和我一样的朋友千万不要这样做,学不到什么?被人写的代码只能做功能的借鉴,捉摸别人的思路是最困难的也是最不适用的方法,还是要自己去捉摸逻辑,自己去优化,把逻辑搞明白了,以后再看别人的代码,也许很快就懂了。开发语言一通百通,大概讲的就是这个吧?不说了,上代码:
#请输入管理序号: #1、增加名片 #input("请输入你的姓名:") #input("请输入你的联系方式:") #input("请输入你的qq:") #input("请输入你的邮箱地址:") #2、修改名片 #3、删除名片 #4、查找名片 #5、遍历名片 #6、退出 infor_group = [] i = 1 while i>0 : while True: serial_str = input("请输入你的管理序号:") try: serial_number = int(serial_str) if type(serial_number) == int : break except: print("请输入数字!!!") if serial_number == 1: name = input("请输入你的姓名:") telephone = input("请输入你的手机号:") qq = input("请输入你的qq:") mail = input("请输入你的mail:") infor = {} infor['name']= name infor['telephone'] = telephone infor['qq']=qq infor['mail']=mail infor_group.append(infor) print("-"*41) print("%s\t%s\t%s\t%s"%("姓名","手机号","qq","mail")) print("-"*41) for infor_show in infor_group: print("%s\t%s\t%s\t%s"%(infor_show['name'],infor_show['telephone'],infor_show['qq'],infor_show['mail'])) elif serial_number == 2: j = 1 while j > 0 : if j == 1: modify_name = "" modify_name = input("请输入你要修改的名片姓名:") j += 1 z = 0 #遍历列表,取出列表中字典元素 for infor_modify in infor_group: #查找要修改名片的姓 if modify_name == infor_modify['name']: z += 1 if z ==1: modify_field = input("请输入你要修改的字段:") modify_content = input("请输入你要修改的内容:") else: print("系统中存在重名是否继续修改,继续请输入1") content =int( input("请输入:")) if content != 1: break if modify_field in infor_modify: infor_modify[modify_field]=modify_content else: print("输入有误,请重新输入!") print("-"*41) print("%s\t%s\t%s\t%s"%("姓名","手机号","qq","mail")) print("-"*41) for infor_show in infor_group: print("%s\t%s\t%s\t%s"%(infor_show['name'],infor_show['telephone'],infor_show['qq'],infor_show['mail'])) h =1 while h == 1: continue_modify = int(input("请输入1、修改下一名片,2、修改字段,3、退出")) if continue_modify == 1: j = 1 h += 1 elif continue_modify == 2: h += 1 elif continue_modify == 3: j = -1 h += 1 else: print("输入有误请重新输入") if z == 0 : print("请输入正确的字段名") j = 1 elif serial_number == 3: #输入要删除的名片姓名 i = 1 while i == 1: del_name = input("请输入你要删除的名片姓名:") #遍历列表,查找对应姓名的名片 j = 0 z = 1 for infor in infor_group: #if 输入姓名= 查找姓名,删除名片 if del_name == infor['name']: z=j del infor_group[z] j += 1 if j == 0: #如果没有查到提示删除的名片不存在 print("列表中没有要查找的名片,请重新输入") else: #打印列表 print("名片已删除") print("-"*41) print("%s\t%s\t%s\t%s"%("姓名","手机号","qq","mail")) print("-"*41) for infor_show in infor_group: print("%s\t%s\t%s\t%s"%(infor_show['name'],infor_show['telephone'],infor_show['qq'],infor_show['mail'])) i += 1 elif serial_number == 4: #输入要查询的名片信息 j = 1 while j == 1: find_field = input("请输入要查的字段:") find_content = input("请输入要查询的内容:") #遍历列表 new_infor = [] n=0 #如果输入姓名==列表姓名,打印查询的内容 for infor in infor_group: for infor_key, infor_values in infor.items(): if find_field ==infor_key and find_content == infor_values: new_infor.append(infor) n = 1 #如果没查到返回报错信息 if n == 0: print("没有找到你要查询的内容,请重新查找") else: print("-"*41) print("%s\t%s\t%s\t%s"%("姓名","手机号","qq","mail")) print("-"*41) for infor_show in new_infor: print("%s\t%s\t%s\t%s"%(infor_show['name'],infor_show['telephone'],infor_show['qq'],infor_show['mail'])) j += 11 elif serial_number == 5: print("-"*41) print("%s\t%s\t%s\t%s"%("姓名","手机号","qq","mail")) print("-"*41) for infor_show in infor_group: print("%s\t%s\t%s\t%s"%(infor_show['name'],infor_show['telephone'],infor_show['qq'],infor_show['mail'])) elif serial_number == 6: break else: print("输入错误,请输入正确序号(1-6)!")
大体的思路就是建立一个空列表,把新增人员的信息存入字典里,然后把字典添加到列表里,根据字典的名字定位字典,查询、修改和删除里面的字段。做完以后回头反复检查,发现有些循环是不必要的,所以做了第二版修改:
1 #请输入管理序号: 2 #1、增加名片 3 #input("请输入你的姓名:") 4 #input("请输入你的联系方式:") 5 #input("请输入你的qq:") 6 #input("请输入你的邮箱地址:") 7 #2、修改名片 8 #3、删除名片 9 #4、查找名片 10 #5、遍历名片 11 #6、退出 12 infor_group = [] 13 def print_list1(): 14 print("-"*41) 15 print("%s\t%s\t%s\t%s"%("姓名","手机号","qq","mail")) 16 print("-"*41) 17 for infor_show in infor_group: 18 print("%s\t%s\t%s\t%s"%(infor_show['name'],infor_show['telephone'],infor_show['qq'],infor_show['mail'])) 19 20 i = 1 21 while i>0 : 22 while True: 23 serial_str = input("请输入你的管理序号:") 24 try: 25 serial_number = int(serial_str) 26 if type(serial_number) == int : 27 break 28 except: 29 print("请输入数字!!!") 30 31 if serial_number == 1: 32 name = input("请输入你的姓名:") 33 telephone = input("请输入你的手机号:") 34 qq = input("请输入你的qq:") 35 mail = input("请输入你的mail:") 36 infor = {} 37 infor['name']= name 38 infor['telephone'] = telephone 39 infor['qq']=qq 40 infor['mail']=mail 41 infor_group.append(infor) 42 print_list1() 43 elif serial_number == 2: 44 j = 1 45 while j > 0 : 46 if j == 1: 47 modify_name = "" 48 modify_name = input("请输入你要修改的名片姓名:") 49 j += 1 50 z = 0 51 #遍历列表,取出列表中字典元素 52 for infor_modify in infor_group: 53 #查找要修改名片的姓 54 if modify_name == infor_modify['name']: 55 z += 1 56 if z ==1: 57 modify_field = input("请输入你要修改的字段:") 58 modify_content = input("请输入你要修改的内容:") 59 else: 60 print("系统中存在重名是否继续修改,继续请输入1") 61 content =int( input("请输入:")) 62 if content != 1: 63 break 64 65 if modify_field in infor_modify: 66 infor_modify[modify_field]=modify_content 67 else: 68 print("输入有误,请重新输入!") 69 print_list1() 70 71 h =1 72 while h == 1: 73 continue_modify = int(input("请输入1、修改下一名片,2、修改字段,3、退出")) 74 if continue_modify == 1: 75 j = 1 76 h += 1 77 elif continue_modify == 2: 78 h += 1 79 elif continue_modify == 3: 80 j = -1 81 h += 1 82 else: 83 print("输入有误请重新输入") 84 85 if z == 0 : 86 print("请输入正确的字段名") 87 j = 1 88 89 90 91 92 elif serial_number == 3: 93 #输入要删除的名片姓名 94 i = 1 95 while i == 1: 96 del_name = input("请输入你要删除的名片姓名:") 97 #遍历列表,查找对应姓名的名片 98 j = 0 99 z = 1 100 for infor in infor_group: 101 #if 输入姓名= 查找姓名,删除名片 102 if del_name == infor['name']: 103 z=j 104 del infor_group[z] 105 j += 1 106 if j == 0: 107 #如果没有查到提示删除的名片不存在 108 print("列表中没有要查找的名片,请重新输入") 109 else: 110 #打印列表 111 print("名片已删除") 112 print_list1() 113 i += 1 114 115 elif serial_number == 4: 116 #输入要查询的名片信息 117 j = 1 118 while j == 1: 119 find_field = input("请输入要查的字段:") 120 find_content = input("请输入要查询的内容:") 121 #遍历列表 122 new_infor = [] 123 n=0 124 #如果输入姓名==列表姓名,打印查询的内容 125 for infor in infor_group: 126 for infor_key, infor_values in infor.items(): 127 if find_field ==infor_key and find_content == infor_values: 128 new_infor.append(infor) 129 n = 1 130 #如果没查到返回报错信息 131 if n == 0: 132 print("没有找到你要查询的内容,请重新查找") 133 else: 134 print("-"*41) 135 print("%s\t%s\t%s\t%s"%("姓名","手机号","qq","mail")) 136 print("-"*41) 137 for infor_show in new_infor: 138 print("%s\t%s\t%s\t%s"%(infor_show['name'],infor_show['telephone'],infor_show['qq'],infor_show['mail'])) 139 j += 11 140 elif serial_number == 5: 141 print_list1() 142 elif serial_number == 6: 143 break 144 else: 145 print("输入错误,请输入正确序号(1-6)!")
第二版只是学到函数,做了简单的调整,随着函数的深入学习,我尝试将每个模块功能分开,用函数封装起来,于是得到第三版,在封装过程中,遇到一个小插叙,耗费我半天的时间才搞明白,原本我是把框架作为主函数一起封装的,但是运行过程中发现自己在函数里修改的全局变量突然不能用了,无论怎么修改都不行,即时在函数外再定义一个全局变量,问题还在,原来我在架构里定义全局,并赋值,即时函数外再定义,修改后的变量会再架构函数里被重新修改,这个地方虽然明白了,却还没有想明白要怎么处理,所以就只能暂时不对架构封装。
1 #请输入管理序号: 2 #1、增加名片 3 #input("请输入你的姓名:") 4 #input("请输入你的联系方式:") 5 #input("请输入你的qq:") 6 #input("请输入你的邮箱地址:") 7 #2、修改名片 8 #3、删除名片 9 #4、查找名片 10 #5、遍历名片 11 #6、退出 12 infor_group = [] #定义一个列表 13 14 #定义管理功能选择 15 def put_num(): 16 while True: 17 serial_str = input("请输入你的管理序号:") 18 try: 19 serial_number = int(serial_str) 20 if type(serial_number) == int : 21 break 22 except: 23 print("请输入数字!!!") 24 return serial_number 25 #定义新增名片函数 26 def put_add(): 27 name = input("请输入你的姓名:") 28 telephone = input("请输入你的手机号:") 29 qq = input("请输入你的qq:") 30 mail = input("请输入你的mail:") 31 infor = {} # 定义空字典 32 #输入信息赋给字典 33 infor['name']= name 34 infor['telephone'] = telephone 35 infor['qq']=qq 36 infor['mail']=mail 37 #字典加入列表 38 infor_group.append(infor) 39 #打印列表 40 print_list1() 41 #定义修改名片姓名函数 42 def put_mvname(): 43 j = 1 44 while j == 1: 45 #modify_name = "" 46 z = 0 47 modify_name = input("请输入你要修改的名片姓名:") 48 for infor_modify in infor_group: 49 if modify_name == infor_modify['name']: 50 j += 1 51 z += 1 52 break 53 if z == 0: 54 print("未查到该名片请重新输入:1、修改名片,3、退出") 55 put_choice() 56 return modify_name # 返回modify_name 57 #定义修改名片字段函数 58 def put_mvfield(modify_name): 59 h = 0 60 while h == 0 : 61 modify_field = input("请输入你要修改的字段:") 62 modify_content = input("请输入你要修改的内容:") 63 #遍历列表,取出列表中字典元素 64 for infor_modify in infor_group: 65 #查找要修改名片的姓名和字段 66 if modify_name == infor_modify['name'] and modify_field in infor_modify: 67 h += 1 68 if h > 1: 69 print("系统中存在重名是否继续修改,继续请输入1") 70 content =int( input("请输入:")) 71 if content != 1: 72 break 73 #修改字段内容 74 infor_modify[modify_field]=modify_content 75 print_list1() 76 77 if h == 0: 78 print("未查到您输入的字段!") 79 print("1、修改名片,2、修改字段,3、退出") 80 h = put_choice() 81 #定义删除名片函数 82 def put_del(): 83 #输入要删除的名片姓名 84 i = 1 85 while i == 1: 86 del_name = input("请输入你要删除的名片姓名:") 87 #遍历列表,查找对应姓名的名片 88 j = 0 89 z = 1 90 for infor in infor_group: 91 #if 输入姓名= 查找姓名,删除名片 92 if del_name == infor['name']: 93 z=j 94 del infor_group[z] 95 j += 1 96 if j == 0: 97 #如果没有查到提示删除的名片不存在 98 print("列表中没有要查找的名片,请重新输入") 99 else: 100 #打印列表 101 print("名片已删除") 102 print_list1() 103 i += 1 104 def put_find(): 105 #输入要查询的名片信息 106 j = 1 107 while j == 1: 108 find_field = input("请输入要查的字段:") 109 find_content = input("请输入要查询的内容:") 110 #遍历列表 111 new_infor = [] 112 n=0 113 #如果输入姓名==列表姓名,打印查询的内容 114 for infor in infor_group: 115 for infor_key, infor_values in infor.items(): 116 if find_field ==infor_key and find_content == infor_values: 117 new_infor.append(infor) 118 n = 1 119 #如果没查到返回报错信息 120 if n == 0: 121 print("没有找到你要查询的内容,请重新查找") 122 else: #打印查询出来的列表 123 print("-"*41) 124 print("%s\t%s\t%s\t%s"%("姓名","手机号","qq","mail")) 125 print("-"*41) 126 for infor_show in new_infor: 127 print("%s\t%s\t%s\t%s"%(infor_show['name'],infor_show['telephone'],infor_show['qq'],infor_show['mail'])) 128 j += 1 129 #定义返回选择函数 130 def put_choice(): 131 h = 1 132 while h == 1: 133 global j 134 continue_modify = int(input("请输入:")) 135 if continue_modify == 1: 136 j = 1 137 h += 1 138 elif continue_modify == 2: 139 h = 0 140 elif continue_modify == 3: 141 j = -1 142 h += 1 143 else: 144 print("输入有误请重新输入") 145 return h 146 #定义打印列表函数 147 def print_list1(): 148 print("-"*41) 149 print("%s\t%s\t%s\t%s"%("姓名","手机号","qq","mail")) 150 print("-"*41) 151 for infor_show in infor_group: 152 print("%s\t%s\t%s\t%s"%(infor_show['name'],infor_show['telephone'],infor_show['qq'],infor_show['mail'])) 153 154 155 #定义名片管理系统框架 156 i = 1 157 while i>0 : 158 serial_number = put_num() 159 160 if serial_number == 1: #新增名片 161 put_add() 162 elif serial_number == 2: #修改名片 163 j=1 164 while j > 0 : 165 mvname = put_mvname() 166 put_mvfield(mvname) 167 elif serial_number == 3: #删除名片 168 put_del() 169 170 elif serial_number == 4: #查找名片 171 put_find() 172 elif serial_number == 5: #遍历列表 173 print_list1() 174 elif serial_number == 6: #退出 175 break 176 else: 177 print("输入错误,请输入正确序号(1-6)!")
时间关系,暂时先做到这里随着学习深入,应该有更好的优化方案,加油!年纪大了,不想做开发者,纯粹个人爱好,勿喷!