目录
1. 目标
综合已经学过的知识点:
- 变量
- 函数
- 模块
- 流程控制
开发 名片管理系统
2.系统需求
3.开发步骤
- 框架搭建
- 新增名片
- 显示所有名片
- 查询名片
- 查询后修改、删除名片
4.开发过程
4.1 框架搭建
目标:搭建系统框架
- 准备文件,确定文件名,保证能够在需要位置编写代码
- 编写 主运行循环,实现基本的用户输入和判断
4.1.1 文件准备
1.新建cards_main.py 保存 主程序功能代码
- 程序入口
- 每次启动系统时,通过main这个文件启动
2. 新建 cards_tools.py 保存 所有名片功能函数
- 将对名片 新增、查询、修改、删除 等功能封装在不同的函数中
4.1.2 编写主运行循环
(1)在 caeds_main.py 中添加一个无限循环,提示用户操作,并对对应操作做出反应。
while True:
# 提示用户操作
action_str = input("请选择希望执行的操作:")
print("您选择的操作为【%s】" % action_str)
# 1,2,3 针对名片的操作
if action_str in ["1","2","3"]:
# 如果在开发程序时,不希望立刻写分支的内部代码
# 可以使用 pass 关键字,表示一个占位符,能够确保程序代码结构完整正确
# 程序运行时,pass 关键字不会执行任何操作
pass
# 0 退出系统
elif action_str == "0":
print("欢迎再次使用【名片管理系统】")
break
# 其他内容,提示用户:输入错误
else:
print("你输入的不正确,请重新选择")
知识补充:
1.空操作:pass
如果在开发程序时,不希望立刻写分支的内部代码
可以使用 pass 关键字,表示一个占位符,能够确保程序代码结构完整正确
程序运行时,pass 关键字不会执行任何操作
2. 字符串判断
if action in ["1","2","3"]
if action=="1" or action=="2" or action=="3"
- 使用 in 针对列表判断,避免使用 or 拼接
- 没有使用 int 进行数据类型转换的用户,可以避免错用
3.无限循环:while True:
Pycharm 注释技巧:
1.TODO 注释
在 # 后跟上 TODO ,用于标记需要去做的工作
# TODO(作者/邮件)具体解释
(2) 在 cards_tools.py 中写好所需的功能函数模块
def show_menu():
'''显示菜单'''
def new_card():
'''新增名片'''
print("新增名片")
def show_all():
'''显示所有名片'''
print("显示所有名片")
def search_card():
'''搜索名片'''
print("搜索名片")
(3)完善 cards_main( ) 主运行文件,之后就只专注功能函数的开发
import cards_tools
while True:
# TODO(孔言) 显示菜单
cards_tools.show_menu()
# todo(孔言) 提示用户操作
action_str = input("请选择希望执行的操作:")
print("您选择的操作为【%s】" % action_str)
# 1,2,3 针对名片的操作
if action_str in ["1","2","3"]:
# 新增名片
if action_str == "1":
cards_tools.new_card()
# 显示全部
if action_str == "2":
cards_tools.show_all()
# 查询名片
if action_str == "3":
cards_tools.search_card()
pass
# 0 退出系统
elif action_str == "0":
print("欢迎再次使用【名片管理系统】")
break
# 其他内容,提示用户:输入错误
else:
print("你输入的不正确,请重新选择")
4.2 数据结构的确定
程序是用来处理数据的,而变量就是用来存储数据的
使用 字典 记录 每一张名片 的详细信息
使用 列表 记录所有 名片字典
(1) 定义名片列表变量
在 cards_tools 文件的顶部增加一个 列表变量
# 所有名片记录的列表
cards_list = [ ]
注意:
- 所有名片相关的操作,都要使用这个列表,所以应该 定义在程序的顶部
- 程序刚运行时,没有数据,所以是 空列表
4.3 各个模块函数的编写
4.3.1 显示菜单函数
def show_menu():
'''显示菜单'''
print("*" * 50)
print("欢迎使用【名片管理系统】V1.0")
print("")
print("1.新增名片")
print("2.显示全部")
print("3.搜索名片")
print("0.退出系统")
print("*" * 50)
'''显示菜单'''
4.3.2 新增名片函数
def new_card():
'''新增名片'''
print("新增名片")
# 1.提示用户输入名片的详细信息
name = input("请输入姓名:")
phone = input("请输入电话:")
qq = input("请输入QQ:")
email = input("请输入邮箱:")
# 2.使用用户的信息创立一个名片字典
cards_dict = {"name":name,
"phone":phone,
"qq":qq,
"email":email}
# 3.将名片字典添加到列表中
cards_list.append(cards_dict)
print(cards_list)
# 4.提示用户添加成功
print("添加%s的名片成功!" % name)
pycharm 使用技巧:整体修改变量名称
4.3.3 显示全部名片函数
def show_all():
'''显示所有名片'''
print("显示所有名片")
# 打印表头
for name in ["姓名","电话","QQ","邮箱"]:
# \t 为制表位,类似空格
print(name,end="\t\t")
print("")
# 判断是否存在名片记录,如果没有,提示用户并返回
if len(cards_list) == 0:
print("无任何名片记录,请使用新增名片功能添加名片!")
# return 可以返回一个函数的执行结果
# 如果 return 后面没有任何内容,表示会返回到调用函数的位置,并且不返回任何结果
return
# 打印分割线
print("="*50)
# 遍历名片列表依次输出字典信息
# 遍历第一个变量名任取,其类型取决于后面
for cards_dict in cards_list:
print("%s\t\t%s\t\t%s\t\t%s" % (cards_dict["name"],
cards_dict["phone"],
cards_dict["qq"],
cards_dict["email"]))
知识补充:return 作用
# return 可以返回一个函数的执行结果 # 如果 return 后面没有任何内容,表示会返回到调用函数的位置,并且不返回任何结果
4.3.4 搜索名片函数
def search_card():
'''搜索名片'''
print("搜索名片")
# 1.提示用户输入搜索姓名
find_name = input("请输入要搜索的姓名:")
# 2.遍历名片列表,查询要搜索的姓名,如果没找到,提示用户
# 此处card_dict 数据类型为字典
for cards_dict in cards_list:
if cards_dict["name"] == find_name:
print("姓名\t\t电话\t\tQQ\t\t邮箱")
print("="*50)
print("%s\t\t%s\t\t%s\t\t%s" % (cards_dict["name"],
cards_dict["phone"],
cards_dict["qq"],
cards_dict["email"]))
# todo 针对找到的名片记录执行修改、删除操作
deal_card(cards_dict)
break
else:
print("抱歉,未找到%s" % find_name)
4.3.5 补充函数
- 为了保证主要函数完整性,增加可读性,所以函数内部需要的特殊功能单独再封装为一个函数。
- 函数定义可前可后,不影响调用。
1. 处理找到的名片:deal_card( )
def deal_card(find_dict):
'''
处理查找到名片
:param find_dict: 查找到的名片
:return:
'''
print(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"],"Email:")
print("修改名片成功")
elif action_str == "2":
cards_list.remove(find_dict)
print("删除名片成功")
2.修改名片补充函数:input_card_info( )
def input_card_info(dict_value,tip_message):
'''
解决修改时必须一一输入的问题,丰富版input()
:param dict_value: 字典中原有的值
:param tip_message: 输入的提示文字
:return: 如果用户输入了内容,就返回内容,否则返回
'''
# 1.提示用户输入内容
result_str = input(tip_message)
# 2.针对用户输入进行判断,如果用户输入了内容,直接返回结果
if len(result_str) > 0:
return result_str
# 3.如果用户没有输入内容,返回字典中原有的值
else:
return dict_value
5.完整代码
5.1 cards_main.py:
import cards_tools
while True:
# TODO(孔言) 显示菜单
cards_tools.show_menu()
# todo(孔言) 提示用户操作
action_str = input("请选择希望执行的操作:")
print("您选择的操作为【%s】" % action_str)
# 1,2,3 针对名片的操作
if action_str in ["1","2","3"]:
# 新增名片
if action_str == "1":
cards_tools.new_card()
# 显示全部
if action_str == "2":
cards_tools.show_all()
# 查询名片
if action_str == "3":
cards_tools.search_card()
# 0 退出系统
elif action_str == "0":
print("欢迎再次使用【名片管理系统】")
break
# 其他内容,提示用户:输入错误
else:
print("你输入的不正确,请重新选择")
5.2 cards.tools.py:
# 记录所有的名片字典
cards_list = []
def show_menu():
'''显示菜单'''
print("*" * 50)
print("欢迎使用【名片管理系统】V1.0")
print("")
print("1.新增名片")
print("2.显示全部")
print("3.搜索名片")
print("0.退出系统")
print("*" * 50)
'''显示菜单'''
def new_card():
'''新增名片'''
print("新增名片")
# 1.提示用户输入名片的详细信息
name = input("请输入姓名:")
phone = input("请输入电话:")
qq = input("请输入QQ:")
email = input("请输入邮箱:")
# 2.使用用户的信息创立一个名片字典
cards_dict = {"name":name,
"phone":phone,
"qq":qq,
"email":email}
# 3.将名片字典添加到列表中
cards_list.append(cards_dict)
print(cards_list)
# 4.提示用户添加成功
print("添加%s的名片成功!" % name)
def show_all():
'''显示所有名片'''
print("显示所有名片")
# 打印表头
for name in ["姓名","电话","QQ","邮箱"]:
# \t 为制表位,类似空格
print(name,end="\t\t")
print("")
# 判断是否存在名片记录,如果没有,提示用户并返回
if len(cards_list) == 0:
print("无任何名片记录,请使用新增名片功能添加名片!")
# return 可以返回一个函数的执行结果
# 如果 return 后面没有任何内容,表示会返回到调用函数的位置,并且不返回任何结果
return
# 打印分割线
print("="*50)
# 遍历名片列表依次输出字典信息
# 遍历第一个变量名任取,其类型取决于后面
for cards_dict in cards_list:
print("%s\t\t%s\t\t%s\t\t%s" % (cards_dict["name"],
cards_dict["phone"],
cards_dict["qq"],
cards_dict["email"]))
def search_card():
'''搜索名片'''
print("搜索名片")
# 1.提示用户输入搜索姓名
find_name = input("请输入要搜索的姓名:")
# 2.遍历名片列表,查询要搜索的姓名,如果没找到,提示用户
# 此处card_dict 数据类型为字典
for cards_dict in cards_list:
if cards_dict["name"] == find_name:
print("姓名\t\t电话\t\tQQ\t\t邮箱")
print("="*50)
print("%s\t\t%s\t\t%s\t\t%s" % (cards_dict["name"],
cards_dict["phone"],
cards_dict["qq"],
cards_dict["email"]))
# 针对找到的名片记录执行修改、删除操作
deal_card(cards_dict)
break
else:
print("抱歉,未找到%s" % find_name)
def deal_card(find_dict):
'''
处理查找到名片
:param find_dict: 查找到的名片
:return:
'''
print(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"],"Email:")
print("修改名片成功")
elif action_str == "2":
cards_list.remove(find_dict)
print("删除名片成功")
def input_card_info(dict_value,tip_message):
'''
解决修改时必须一一输入的问题,丰富版input()
:param dict_value: 字典中原有的值
:param tip_message: 输入的提示文字
:return: 如果用户输入了内容,就返回内容,否则返回
'''
# 1.提示用户输入内容
result_str = input(tip_message)
# 2.针对用户输入进行判断,如果用户输入了内容,直接返回结果
if len(result_str) > 0:
return result_str
# 3.如果用户没有输入内容,返回字典中原有的值
else:
return dict_value