一、成果示例
新建,显示全部
查询、修改与删除
展示所有、退出
二、演练目标
- 新建名片
- 删除名片
- 修改名片
- 查询名片
三、实现步骤
1>框架搭建
- 搭建框架结构,保证主体代码的运行
- 准备文件,确定文件名,保证能够在需要的位置编写代码
- 编写主运行循环,实现基本的用户输入和判断
1.准备两个文件
- 其中,main文件保存主程序功能代码,它是程序的入口
- 编写主运行循环,实现基本的用户输入和判断
- tools文件保存所有功能函数,将CRUD功能封装到不同的函数中
2.编写主运行循环,实现基本的用户输入和判断。
- 不需要立刻编写的代码,使用pass关键字跳过。pass可以保证程序结构的完整性。
- 用户的输入如果转成int,程序很容易报错,所以保持字符串类型就好。
- main:
while 1:
# TODO 显示功能菜单
# 提示用户输入
operate_str = input("请选择操作功能")
print("您选择的操作是【%s】" % operate_str)
# 判断选择分支
if operate_str == "0":
print("感谢您的使用,祝您生活愉快")
break
elif operate_str == "1":
pass
elif operate_str == "2":
pass
elif operate_str == "3":
pass
else:
print("输入错误,请重新输入")
continue
TODO注释:
- 用于提示下一步工作
- 多人同时编写
3.在tools文件中写入展示主菜单代码,并在main文件中导入模块,使用函数
- tools:
def show_menu():
"展示名片管理系统主菜单"
print('*' * 50)
print("欢迎使用【名片管理系统】")
print("1. 新建名片")
print("2. 显示全部")
print("3. 查询名片")
print("")
print("0. 退出系统")
print('*' * 50)
- main:
注意划红线的代码
4.在tools中写入1、2、3对应功能函数,并在主函数进行调用。
- tools:(下方增加)
def create_card():
"新增名片"
print("-"*50)
print("新增名片")
def show_total():
"显示所有名片"
print("-"*50)
print("显示所有名片")
def select_card():
"查看名片"
print("-"*50)
print("查看名片")
- main中的pass改为调用函数
- 至此,main文件编写完毕
5.定义存储容器
- 每个人的名片,用字典
- 所有名片,用列表
- 在tools顶端增加 cards_list = []
6.新增名片功能
- 要有一个字典,装用户名片
- 提示用户输入
- 将这个字典写入列表
- 提示成功
- tools中,新增名片的函数改为:
def create_card():
"新增名片"
print("-"*50)
print("新增名片")
# 提示用户输入
name_value = input("请输入姓名: ")
tel_value = input("请输入电话: ")
qq_value = input("请输入QQ号码: ")
email_value = input("请输入电子邮箱: ")
card_dict = {
"name": name_value,
"tel": tel_value,
"qq": qq_value,
"email": email_value
}
cards_list.append(card_dict)
print("添加%s的名片成功!" % card_dict["name"])
7.展示所有名片
- 打印所有名片在终端
- 最好有一定格式
- tools文件中,展示所有名片函数改为:
def show_total():
"显示所有名片"
print("-"*50)
print("显示所有名片")
print("")
print("姓名\t\t电话\t\tQQ号码\t\t电子邮箱")
print("-"*50)
for card_dict in cards_list:
print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"], card_dict["tel"], card_dict["qq"], card_dict["email"]))
- 以上的
\t
重复输入,所以可以采取另一种方法,就是循环。但具体哪种简便,看实际需求。
8.当没有任何名片时,不打印表头,显示提示并返回
- 用户输入名字
- 判断(可以用空列表的布尔值判断)
- tools文件中显示所有名片代码更改为:
def show_total():
"显示所有名片"
if cards_list:
print("-"*50)
print("显示所有名片")
print("")
print("姓名\t\t电话\t\tQQ号码\t\t电子邮箱")
print("-"*50)
for card_dict in cards_list:
print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"], card_dict["tel"], card_dict["qq"], card_dict["email"]))
else:
print("!!!名片列表中暂无数据!!!")
9.搜索功能
- 根据搜索来查找名片
- 展示对名片的操作
- 又新增一个函数,展示扩展功能
- tools文件中查询函数更改为:
def select_card():
"查看名片"
print("-"*50)
print("查看名片")
print("")
find_name = input("您想查询谁的名片信息?")
for card_dict in cards_list:
if find_name == card_dict["name"]:
print("姓名\t\t电话\t\tQQ号码\t\t电子邮箱")
print("-"*50)
print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"], card_dict["tel"], card_dict["qq"], card_dict["email"]))
# TODO 一个后续三选一的函数
break
else:
print("对不起,名片不存在")
10.查询的后续处理函数
- 有返回上一级要明确一点:在函数执行完成之后,会返回到引用函数的位置。
- 在一个小括号里的字符串,可以拆成多个字符串,以分别都用引号包裹即可。
- 想理解下面改变传入字典的值为何会对原字典产生影响,需要理解引用的概念
- 在“# TODO 一个后续函数”处,引用新函数,传入要修改的字典参数。
alter_or_delete(card_dict)
- tools文件中,新增函数:
def alter_or_delete(find_card):
aod = input("想对这个名片执行什么操作? "
"【1】修改/ 【2】删除/ 【其它任意值】 返回上级菜单")
# 只要退出这个函数,就会返回引用这个函数的位置,从而返回主菜单
if aod == "1":
alter_card(find_card)
elif aod == "2":
delete_card(find_card)
11.修改函数
- tools文件中,新增函数:
def alter_card(find_card):
"修改名片"
print("-"*50)
print("修改名片")
print("")
find_card["name"] = input("请输入要修改的名字")
find_card["tel"] = input("请输入要修改的电话")
find_card["qq"] = input("请输入要修改的QQ号码")
find_card["email"] = input("请输入要修改的电子邮箱")
print("修改名片成功")
12.修改函数进阶
- 会发现其实修改函数并不方便,不需要修改的数据如果能直接输入原值就好了。input函数并没有这个功能,所以定义一个更高级的input函数。
- 这个函数要能:
- 输入内容,返回输入的内容
- 未输入内容,返回字典的原值(所以传入参数时,要传入字典原值)
- 要有复用性,所以提示信息要不同(所以传入参数,作为提示信息)
- tools文件中,新增函数:
def sup_input(dict_value,hint):
"一个超级的输入函数,如果输入的是空值,返回字典中的原值"
user_input = input("%s" % hint)
if user_input: # 利用布尔值
return user_input # 返回输入的值
else:
return dict_value # 返回字典原有的值
- tools文件中,修改函数更改为:
def alter_card(find_card):
"修改名片"
print("-"*50)
print("修改名片")
print("")
find_card["name"] = sup_input(find_card["name"], "请输入要修改的名字(不更改直接使用回车)")
find_card["tel"] = sup_input(find_card["name"], "请输入要修改的电话(不更改直接使用回车)")
find_card["qq"] = sup_input(find_card["name"], "请输入要修改的QQ号码(不更改直接使用回车)")
find_card["email"] = sup_input(find_card["name"], "请输入要修改的电子邮箱(不更改直接使用回车)")
print("修改名片成功")
13.删除函数
- tools文件中,新增函数:
def delete_card(find_card):
"删除名片"
print("-"*50)
print("删除名片")
print("")
cards_list.remove(find_card)
print("删除名片成功!")
14.Shebang
- (这个程序是我用windows写的,所以我的代码中,不会有shebang)
- 如果希望在终端中,输入文件名直接运行程序,就要用到shebang
#!
这个符号叫shebang,或者she-bang- 在main程序开头,利用
#!
指定解释器完整路径即可 - **完整路径:**在终端中,输入 which python
#! 解释器绝对路径
四、代码展示
- 删除了所有TODO注释
- 增加了参数注释
- 完整代码如下,直接复制黏贴即可
main文件
import cards_tools as tool # 通过取别名,来让整体代码更简洁
while 1:
tool.show_menu()
# 提示用户输入
operate_str = input("请选择操作功能")
print("您选择的操作是【%s】" % operate_str)
# 判断选择分支
if operate_str == "0":
print("感谢您的使用,祝您生活愉快")
break
elif operate_str == "1":
tool.create_card()
elif operate_str == "2":
tool.show_total()
elif operate_str == "3":
tool.select_card()
else:
print("输入错误,请重新输入")
continue
tools文件
cards_list = [
{"name": "消防", "tel": "119", "qq": "119119", "email": "[email protected]"},
{"name": "警局", "tel": "110", "qq": "110110", "email": "[email protected]"},
{"name": "医院", "tel": "121", "qq": "120120", "email": "[email protected]"}
]
def show_menu():
"展示名片管理系统主菜单"
print('*' * 50)
print("欢迎使用【名片管理系统】V 1.0")
print("1. 新建名片")
print("2. 显示全部")
print("3. 查询名片")
print("")
print("0. 退出系统")
print('*' * 50)
def create_card():
"新增名片"
print("-"*50)
print("新增名片")
print("")
# 提示用户输入
name_value = input("请输入姓名: ")
tel_value = input("请输入电话: ")
qq_value = input("请输入QQ号码: ")
email_value = input("请输入电子邮箱: ")
card_dict = {
"name": name_value,
"tel": tel_value,
"qq": qq_value,
"email": email_value
}
cards_list.append(card_dict)
print("添加%s的名片成功!" % card_dict["name"])
def show_total():
"显示所有名片"
if cards_list:
print("-"*50)
print("显示所有名片")
print("")
print("姓名\t\t电话\t\tQQ号码\t\t电子邮箱")
print("-"*50)
for card_dict in cards_list:
print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"], card_dict["tel"], card_dict["qq"], card_dict["email"]))
else:
print("!!!名片列表中暂无数据!!!")
def select_card():
"查看名片"
print("-"*50)
print("查看名片")
print("")
find_name = input("您想查询谁的名片信息?")
for card_dict in cards_list:
if find_name == card_dict["name"]:
print("姓名\t\t电话\t\tQQ号码\t\t电子邮箱")
print("-"*50)
print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"], card_dict["tel"], card_dict["qq"], card_dict["email"]))
alter_or_delete(card_dict) # 使用一个函数,执行后续操作
break
else:
print("对不起,名片不存在")
def alter_or_delete(find_card):
"""查询名片后续操作,修改或删除
:param find_card: 查找到的字典
"""
aod = input("想对这个名片执行什么操作? "
"【1】修改/ 【2】删除/ 【其它任意值】 返回上级菜单")
# 只要退出这个函数,就会返回引用这个函数的位置,从而返回主菜单
if aod == "1":
alter_card(find_card)
elif aod == "2":
delete_card(find_card)
def alter_card(find_card):
"""修改名片
:param find_card: 查找到的字典
"""
print("-"*50)
print("修改名片")
print("")
find_card["name"] = sup_input(find_card["name"], "请输入要修改的名字(不更改直接使用回车)")
find_card["tel"] = sup_input(find_card["name"], "请输入要修改的电话(不更改直接使用回车)")
find_card["qq"] = sup_input(find_card["name"], "请输入要修改的QQ号码(不更改直接使用回车)")
find_card["email"] = sup_input(find_card["name"], "请输入要修改的电子邮箱(不更改直接使用回车)")
print("修改名片成功")
def delete_card(find_card):
"""删除名片
:param find_card: 查找到的字典
"""
print("-"*50)
print("删除名片")
print("")
cards_list.remove(find_card)
print("删除名片成功!")
def sup_input(dict_value, hint):
"""超级输入:不输入返回字典原值,输入直接返回
:param dict_value: 字典原值
:param hint: 提示信息
:return: 字典原值/直接返回
"""
user_input = input("%s" % hint)
if user_input: # 利用布尔值
return user_input # 返回输入的值
else:
return dict_value # 返回字典原有的值