综合应用已经学习过的知识点:
开发 名片管理系统
系统需求
- 程序启动,显示名片管理系统欢迎界面,并显示功能菜单
1 2 3 4 5 6 7 8 9
| ************************************************** 欢迎使用【名片管理系统】V1.0
1. 新建名片 2. 显示全部 3. 查询名片
0. 退出系统 **************************************************
|
- 用户用数字选择不同的功能
- 根据功能选择,执行不同的功能
- 用户名片需要记录用户的 姓名、电话、QQ、邮件
- 如果查询到指定的名片,用户可以选择 修改 或者 删除 名片
步骤
- 框架搭建
- 新增名片
- 显示所有名片
- 查询名片
- 查询成功后修改、删除名片
- 让 Python 程序能够直接运行
01. 框架搭建
目标
- 搭建名片管理系统 框架结构
- 准备文件,确定文件名,保证能够 在需要的位置 编写代码
- 编写 主运行循环,实现基本的 用户输入和判断
1.1 文件准备
- 新建
cards_main.py
保存 主程序功能代码
- 程序的入口
- 每一次启动名片管理系统都通过
main
这个文件启动
- 新建
cards_tools.py
保存 所有名片功能函数
- 将对名片的 新增、查询、修改、删除 等功能封装在不同的函数中
1.2 编写主运行循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| while True:
action = input("请选择操作功能:")
print("您选择的操作是:%s" % action)
if action in ["1", "2", "3"]: pass elif action == "0": print("欢迎再次使用【名片管理系统】")
break else: print("输入错误,请重新输入")
|
字符串判断
1
| if action in ["1", "2", "3"]:
|
1
| if action == "1" or action == "2" or action == "3":
|
- 使用
in
针对 列表 判断,避免使用 or
拼接复杂的逻辑条件
- 没有使用
int
转换用户输入,可以避免 一旦用户输入的不是数字,导致程序运行出错
pass
pass
就是一个空语句,不做任何事情,一般用做占位语句
- 是为了保持程序结构的完整性
无限循环
- 在开发软件时,如果 不希望程序执行后 立即退出
- 可以在程序中增加一个 无限循环
- 由用户来决定 退出程序的时机
TODO 注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| def show_menu():
"""显示菜单 """ pass
def new_card():
"""新建名片 """ print("-" * 50) print("功能:新建名片")
def show_all():
"""显示全部 """ print("-" * 50) print("功能:显示全部")
def search_card():
"""搜索名片 """ print("-" * 50) print("功能:搜索名片")
|
1.4 导入模块
- 在
cards_main.py
中使用 import
导入 cards_tools
模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import cards_tools
while True:
cards_tools.show_menu()
action = input("请选择操作功能:")
print("您选择的操作是:%s" % action)
if action in ["1", "2", "3"]:
if action == "1": cards_tools.new_card()
elif action == "2": cards_tools.show_all()
elif action == "3": cards_tools.search_card()
elif action == "0": print("欢迎再次使用【名片管理系统】")
break else: print("输入错误,请重新输入:")
|
至此:cards_main
中的所有代码全部开发完毕!
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def show_menu():
"""显示菜单 """ print("*" * 50) print("欢迎使用【菜单管理系统】V1.0") print("") print("1. 新建名片") print("2. 显示全部") print("3. 查询名片") print("") print("0. 退出系统") print("*" * 50)
|
02. 保存名片数据的结构
程序就是用来处理数据的,而变量就是用来存储数据的
- 使用 字典 记录 每一张名片 的详细信息
- 使用 列表 统一记录所有的 名片字典
定义名片列表变量
- 在
cards_tools
文件的顶部增加一个 列表变量
注意
- 所有名片相关操作,都需要使用这个列表,所以应该 定义在程序的顶部
- 程序刚运行时,没有数据,所以是 空列表
03. 新增名片
3.1 功能分析
- 提示用户依次输入名片信息
- 将名片信息保存到一个字典
- 将字典添加到名片列表
- 提示名片添加完成
3.2 实现 new_card 方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| def new_card():
"""新建名片 """ print("-" * 50) print("功能:新建名片")
name = input("请输入姓名:") phone = input("请输入电话:") qq = input("请输入 QQ 号码:") email = input("请输入邮箱:")
card_dict = {"name": name, "phone": phone, "qq": qq, "email": email}
card_list.append(card_dict)
print(card_list) print("成功添加 %s 的名片" % card_dict["name"])
|
技巧:在 PyCharm
中,可以使用 SHIFT + F6
统一修改变量名
04. 显示所有名片
4.1 功能分析
4.2 基础代码实现
1 2 3 4 5 6 7 8 9 10 11
| def show_all():
"""显示全部 """ print("-" * 50) print("功能:显示全部")
for card_dict in card_list:
print(card_dict)
|
4.3 增加标题和使用 \t
显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| def show_all(): """显示全部 """ print("-" * 50) print("功能:显示全部")
for name in ["姓名", "电话", "QQ", "邮箱"]: print(name, end="\t\t")
print("")
print("=" * 50)
for card_dict in card_list:
print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"], card_dict["phone"], card_dict["qq"], card_dict["email"]))
|
4.4 增加没有名片记录判断
1 2 3 4 5 6 7 8 9 10 11 12
| def show_all(): """显示全部 """ print("-" * 50) print("功能:显示全部")
if len(card_list) == 0: print("提示:没有任何名片记录")
return
|
注意
- 在函数中使用
return
表示返回
- 如果在
return
后没有跟任何内容,只是表示该函数执行到此就不再执行后续的代码
05. 查询名片
5.1 功能分析
- 提示用户要搜索的姓名
- 根据用户输入的姓名遍历列表
- 搜索到指定的名片后,再执行后续的操作
5.2 代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| def search_card():
"""搜索名片 """ print("-" * 50) print("功能:搜索名片")
find_name = input("请输入要搜索的姓名:")
for card_dict in card_list:
if card_dict["name"] == find_name:
print("姓名\t\t\t电话\t\t\tQQ\t\t\t邮箱") print("-" * 40) print("%s\t\t\t%s\t\t\t%s\t\t\t%s" % ( card_dict["name"], card_dict["phone"], card_dict["qq"], card_dict["email"]))
print("-" * 40)
break else: print("没有找到 %s" % find_name)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| def deal_card(find_dict):
"""操作搜索到的名片字典
:param find_dict:找到的名片字典 """ print(find_dict)
action_str = input("请选择要执行的操作 " "[1] 修改 [2] 删除 [0] 返回上级菜单")
if action == "1": print("修改") elif action == "2": print("删除")
|
06. 修改和删除
6.1 查询成功后删除名片
- 由于找到的字典记录已经在列表中保存
- 要删除名片记录,只需要把列表中对应的字典删除即可
1 2 3 4
| elif action == "2": card_list.remove(find_dict)
print("删除成功")
|
6.2 修改名片
- 由于找到的字典记录已经在列表中保存
- 要修改名片记录,只需要把列表中对应的字典中每一个键值对的数据修改即可
1 2 3 4 5 6 7 8 9
| if action == "1":
find_dict["name"] = input("请输入姓名:") find_dict["phone"] = input("请输入电话:") find_dict["qq"] = input("请输入QQ:") find_dict["email"] = input("请输入邮件:")
print("%s 的名片修改成功" % find_dict["name"])
|
修改名片细化
- 如果用户在使用时,某些名片内容并不想修改,应该如何做呢?—— 既然系统提供的
input
函数不能满足需求,那么就新定义一个函数 input_card_info
对系统的 input
函数进行扩展
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| def input_card_info(dict_value, tip_message):
"""输入名片信息
:param dict_value: 字典原有值 :param tip_message: 输入提示信息 :return: 如果输入,返回输入内容,否则返回字典原有值 """ result_str = input(tip_message)
if len(result_str) > 0:
return result_str else:
return dict_value
|
07. LINUX 上的 Shebang
符号(#!
)
#!
这个符号叫做 Shebang
或者 Sha-bang
Shebang
通常在 Unix
系统脚本的中 第一行开头 使用
- 指明 执行这个脚本文件 的 解释程序
使用 Shebang 的步骤
- 使用
which
查询 python3
解释器所在路径
- 修改要运行的 主 python 文件,在第一行增加以下内容
- 修改 主 python 文件 的文件权限,增加执行权限
1
| $ chmod +x cards_main.py
|
源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| card_list = []
def show_menu(): '''显示菜单''' print("*" * 50) print("欢迎使用【名片管理系统】 V1.0") print() print("1. 新建名片") print("2. 显示全部") print("3. 查询名片") print() print("0. 退出系统") print("*" * 50)
def new_card():
"""新增名片""" name = input("请输入姓名:") phone = input("请输入手机号:") qq = input("请输入QQ号:") email = input("请输入邮箱:")
card_dict = {"name": name, "phone": phone, "qq": qq, "email": email}
card_list.append(card_dict)
print("添加 {} 的名片成功!".format(name))
def show_all():
"""显示所有名片""" print("显示所有名片")
if len(card_list) == 0: print("当前没有任何的名片记录,请使用新增功能添加名片!") return else: for name in ["姓名", "电话", "QQ", "邮箱"]: print("{:15}".format(name), end=" ") print()
print("-" * 50)
for card_dict in card_list: print("{:15}{:15}{:15}{:15}".format(card_dict["name"], card_dict["phone"], card_dict["qq"], card_dict["email"]))
def search_card():
"""搜索名片""" print("搜索名片")
find_name = input("请输入要搜索的姓名:")
for user_info in card_list: if user_info["name"] == find_name: for name in ["姓名", "电话", "QQ", "邮箱"]: print("{:20}".format(name), end=" ") print() print("-" * 50) print("{:20}{:20}{:20}{:20}".format(user_info["name"], user_info["phone"], user_info["qq"], user_info["email"]))
deal_card(user_info)
break
else: print("抱歉,没有找到{}的名片".format(find_name))
def deal_card(find_dict): """处理查找到的名片
:param find_dict: 查找到的名片 """ action_str = input("请选择要执行的操作: " "[1] 修改 / [2] 删除 / [0] 返回上级菜单")
if action_str == "1": find_dict["name"] = input_card_info(find_dict["name"], "姓名[回车不修改]:") find_dict["phone"] = input_card_info(find_dict["phone"], "电话[回车不修改]:") find_dict["qq"] = input_card_info(find_dict["qq"], "QQ[回车不修改]:") find_dict["email"] = input_card_info(find_dict["email"], "邮箱[回车不修改]:") print("修改{}的名片成功!".format(find_dict["name"])) elif action_str == "2": card_list.remove(find_dict) print("删除{}的名片成功!".format(find_dict["name"]))
def input_card_info(dict_value, tip_message): """输入名片信息
:param dict_value: 字典原有数值 :param tip_message: 用户输入提示信息 :return: 如果用户输入了内容,就返回内容,如果没有输入内容,则用字典中原有的值 """ result_str = input(tip_message)
if len(result_str) > 0: return result_str else: return dict_value
|
cards_main代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| import cards_tools
while True:
cards_tools.show_menu()
action_str = input("请选择您希望执行的操作:") print("您选择的操作是【{}】".format(action_str))
if action_str in ["1","2","3"]: if action_str == "1": print("-" * 50) cards_tools.new_card()
if action_str == "2": print("-" * 50) cards_tools.show_all()
if action_str == "3": print("-" * 50) cards_tools.search_card()
elif action_str == "0": print("欢迎再次使用【名片管理系统】") break else: print("您输入的不正确,请重新选择")
|
效果预览