1. 系统需求
- 程序启动, 显示名片管理系统欢迎界面, 并显示功能菜单
- 用户用数字选择不同的功能
- 根据功能选择, 执行不能的功能
- 用户名片需要记录用户的 姓名 , 电话 , QQ ,邮件
- 如果查询到指定的名片, 用户可以选择 修改 或者 删除 名片
步骤
- 框架搭建
- 新增名片
- 显示所有名片
- 查询名片
- 查询成功后修改, 删除名片
- 让 Python 程序能够直接运行
2. 框架搭建
目标
- 搭建名片管理系统 框架结构
- 准备文件, 确定文件名, 保证能够 在需要的位置 编写代码
- 编写 主运行循环, 实现基本的 用户输入和判断
2.1 文件准备
1. 新建 cards_main.py 保存 主程序功能代码
程序的入口
2. 新建 cards_tools.py 保存 所有名片功能函数
- 将对名片的 新增, 查询, 修改, 删除 等功能封装在不同的函数中
2.2 编写主运行循环
- 在 cards_main 中添加一个 无限循环
1 while True: 2 3 # 显示功能菜单 4 5 action_str = input("请选择希望执行的操作: ") 6 7 print("您选择的操作是 %s" % action_str) 8 9 # 根据用户输入决定后续的操作 10 if action_str in ["1", "2", "3"]: 11 pass 12 # 0 退出系统 13 elif action_str == "0": 14 15 print("欢迎再次使用【名片管理系统】") 16 17 break 18 # 如果在开发程序时, 不希望立刻写分支内部的代码 19 # 可以使用 pass 关键字, 表示一个占位符, 能够保证程序的代码结构正确! 20 # 程序运行时, pass 关键字不会执行任何的操作! 21 # pass 22 # 其他内容输入错误, 需要提示用户 23 else: 24 print("您输入的不正确, 请重新选择")
字符串判断
if action in ["1", "2", "3"]
if action == "1" or action == "2" or action == "3"
1. 使用 in 针对 列表 判断, 避免使用 or 拼接复杂的逻辑条件
2. 没有使用 int 转换用户输入, 可以避免 一旦用户输入的不是数字, 导致程序运行出错
pass
- pass 就是一个空语句, 不做任何事情, 一般用做占位语句
- 是为了保持程序结构的完整性
无限循环
在开发软件时, 如果 不希望程序执行后 立即退出
可以在程序中增加一个 无限循环
用用户来决定 退出程序的时机
TODO 注释
在 # 后跟上 TODO , 用于标记需要去做的工作,
简单说 : 就是这个地方要写功能代码, 还没写, 做一个标记, 写完了在把 TODO注释 去掉
# TODO (作者 / 邮件) 显示系统菜单
在 PyCharm 左下角可以查找到哪些地方做过 TODO 注释 ,然后点击跳转, 就可以直接开始写代码了
3. 保存名片数据的结构
程序就是用来处理数据的, 而变量就是用来存储数据的
- 使用 字典 记录 每一张名片 的详细信息
- 使用 列表 统一记录所有的 名片字典
定义名片列表变量
在 cards_tools 文件的顶部增加一个 列表变量
# 记录所有名片的列表
card_list = []
注意 :
所有名片相关操作, 都需要使用这个列表, 所以应该 定义在程序的顶部
程序刚运行时, 没有数据, 所以是 空列表
1 import cards_tools 2 3 while True: 4 5 # 显示功能菜单 6 cards_tools.show_menu() 7 8 action_str = input("请选择希望执行的操作: ") 9 10 print("您选择的操作是 %s" % action_str) 11 12 # 根据用户输入决定后续的操作 13 if action_str in ["1", "2", "3"]: 14 15 # 新增名片 16 if action_str == "1": 17 cards_tools.new_card() 18 # 显示全部 19 elif action_str == "2": 20 cards_tools.show_all() 21 # 查询名片 22 elif action_str == "3": 23 cards_tools.search_card() 24 pass 25 # 0 退出系统 26 elif action_str == "0": 27 28 print("欢迎再次使用【名片管理系统】") 29 30 break 31 # 如果在开发程序时, 不希望立刻写分支内部的代码 32 # 可以使用 pass 关键字, 表示一个占位符, 能够保证程序的代码结构正确! 33 # 程序运行时, pass 关键字不会执行任何的操作! 34 # pass 35 # 其他内容输入错误, 需要提示用户 36 else: 37 print("您输入的不正确, 请重新选择")
1 # 记录所有名片的列表 2 card_list = [] 3 4 5 def show_menu(): 6 """显示菜单""" 7 print("*" * 30) 8 print("欢迎使用【名片管理系统】v 8.0") 9 print("") 10 print("1 . 新建名片") 11 print("2 . 显示全部") 12 print("3 . 搜索名片") 13 print("") 14 print("0 . 退出系统") 15 print("*" * 30) 16 17 18 def new_card(): 19 """新增名片""" 20 print("-" * 30) 21 print("新增名片") 22 # 1. 提示用户输入名片的详细信息 23 name_str = input("请输入姓名: ") 24 phone_str = input("请输入电话: ") 25 qq_str = input("请输入QQ: ") 26 email_str = input("请输入邮箱: ") 27 # 2. 使用用户输入信息建立一个名片字典 28 card_dict = { 29 "name": name_str, 30 "phone": phone_str, 31 "qq": qq_str, 32 "email": email_str 33 } 34 35 # 3. 将名片字典添加到列表中 36 card_list.append(card_dict) 37 38 print(card_list) 39 40 # 4. 提示用户添加名片成功 41 print("添加 %s 的名片成功" % card_dict['name']) 42 43 44 def show_all(): 45 """显示所有名片""" 46 print("-" * 30) 47 print("显示所有名片") 48 # 判断是否存在名片记录, 如果没有, 提示用户并且返回 49 if len(card_list) == 0: 50 print("当前没有任何的名片记录, 请使用新增功能添加名片") 51 52 # return 可以返回一个函数的执行结果 53 # 下方的代码不会被执行 54 # 如果 return 后面没有任何的内容, 表示会返回到调用函数的位置 55 # 并且不返回任何的结果 56 return 57 58 # 打印表头 59 for name in ["姓名", "电话", "QQ", "邮箱"]: 60 print(name, end=" ") 61 print("") 62 63 # 打印分割线 64 print("=" * 30) 65 66 # 遍历名片列表一次输入字典信息 67 for card_dict in card_list: 68 # 遍历名片信息 69 for item in card_dict: 70 print(card_dict[item], end=" ") 71 print("") 72 73 74 def search_card(): 75 """搜索名片""" 76 print("-" * 30) 77 print("搜索名片") 78 79 # 1. 提示用户输入要搜索的姓名 80 find_name = input("请输入要搜索的姓名: ") 81 82 # 2. 遍历名片列表, 查询要搜索的姓名, 如果没有找到, 需要提示用户 83 for card_dict in card_list: 84 85 if card_dict["name"] == find_name: 86 print("姓名 电话 QQ 邮箱") 87 print("=" * 30) 88 print("%s %s %s %s" % (card_dict["name"], 89 card_dict["phone"], 90 card_dict["qq"], 91 card_dict["email"])) 92 93 # 针对找到的名片记录执行修改和删除的操作 94 deal_card(card_dict) 95 96 break 97 98 else: 99 100 print("抱歉, 没有找到 %s" % find_name) 101 102 103 def deal_card(find_dict): 104 """处理查找到的名片 105 :param find_dict: 查找到的名片 106 """ 107 print(find_dict) 108 109 # 110 action_str = input("请输入对名片的操作: 1. 修改 2. 删除 0. 返回上级菜单") 111 112 if action_str == "1": 113 find_dict['name'] = input_card_info(find_dict['name'], "姓名: ") 114 find_dict['phone'] = input_card_info(find_dict['phone'], "电话: ") 115 find_dict['qq'] = input_card_info(find_dict['qq'], "QQ: ") 116 find_dict['email'] = input_card_info(find_dict['email'], "邮箱: ") 117 118 print("修改名片成功! ") 119 elif action_str == "2": 120 121 card_list.remove(find_dict) 122 123 print("删除名片成功!") 124 125 126 def input_card_info(dict_value, tip_message): 127 """输入名片信息 128 :param dict_value: 字典中原有的值 129 :param tip_message: 输入的提示文字 130 :return: 131 """ 132 133 # 1. 提示用户输入内容 134 result_str = input(tip_message) 135 # 2. 针对用户的输入进行判断, 如果用户输入了内容, 直接返回结果 136 if len(result_str) > 0: 137 return result_str 138 # 3.如果用户没有输入内容, 返回 "字典中原有的值" 139 else: 140 return dict_value