原文链接

01_程序要求

  • 程序启动,显示名片管理系统欢迎界面,并显示功能菜单
  • 用户用数字选择不同的功能
  • 根据功能选择,执行不同的功能
  • 用户名片需要记录用户的 姓名、性别、年龄
  • 如果查询到指定的名片,用户可以选择 修改 或者 删除 名片

02_步骤

框架搭建

  • 准备文件,确定文件名,保证能够 在需要的位置 编写代码
  • 编写 主运行循环,实现基本的 用户输入和判断

文件准备

  • 新建 cards_main.py 保存 主程序功能代码
    i.程序的入口
    ii.每一次启动名片管理系统都通过 main 这个文件启动

  • 新建 cards_tools.py 保存 所有名片功能函数
    将对名片的 新增、查询、修改、删除 等功能封装在不同的函数中

编写主运行循环

  • cards_main 中添加一个 无限循环
  1. while True:
  2. # TODO(小明) 显示系统菜单
  3. # 根据用户输入决定后续的操作
  4. if num == 1: # 新建名片
  5. pass
  6. elif num == 2: # 显示全部
  7. pass
  8. elif num == 3: # 查询名片
  9. pass
  10. elif num == 0:
  11. break
  12. else:
  13. print("输入错误,请重新输入")
  • pass 就是一个空语句,不做任何事情,一般用做占位语句,是为了保持程序结构的完整性
  • 在开发软件时,如果 不希望程序执行后 立即退出,可以在程序中增加一个 无限循环,由用户来决定 退出程序的时机
  • # 后跟上 TODO,用于标记需要去做的工作
  • 在界面左下角的图表中,选择 TODO ,并找到文件夹下的程序,点击 TODO ,能快速定位到标记的位置

cards_tools 中增加四个新函数

  1. def show_menu():
  2. """显示菜单
  3. """
  4. pass
  5. def new_card():
  6. print("-" * 50)
  7. print("功能:新建名片")
  8. def show_all():
  9. print("-" * 50)
  10. print("功能:显示全部")
  11. def search_card():
  12. print("-" * 50)
  13. print("功能:搜索名片")

导入模块

  • cards_main.py 中使用 import 导入 cards_tools 模块
  1. import cards_tools
  • 修改 while 循环的代码如下:
  1. while True:
  2. num = cards_tools.show_menu()
  3. if num == 1: # 新建名片
  4. cards_tools.new_card(cards_list)
  5. elif num == 2: # 显示全部
  6. cards_tools.show_all(cards_list)
  7. elif num == 3: # 查询名片
  8. cards_tools.search_card(cards_list)
  9. elif num == 0:
  10. print("欢迎再次使用【名片管理系统】")
  11. break
  12. else:
  13. print("输入错误,请重新输入")

完成 show_menu 函数

  1. def show_menu():
  2. oper_tuple = ("退出系统", "新建名片", "显示全部", "查询名片")
  3. print("*" * 50)
  4. print("欢迎使用【名片管理系统】V1.0\n")
  5. print("1.新建名片")
  6. print("2.显示全部")
  7. print("3.查询名片\n")
  8. print("0.退出系统")
  9. print("*" * 50)
  10. num_str = input("请选择操作功能:")
  11. if num_str not in ["0", "1", "2", "3"]: # 如果输入的不在选项中
  12. print("输入错误,请重新输入")
  13. return
  14. num = int(num_str)
  15. print("你选择的操作是:%d" % num)
  16. print('-' * 50)
  17. print("功能:%s" % oper_tuple[num])
  18. return num

保存名片数据的结构

  • 程序就是用来处理数据的,而变量就是用来存储数据的
  • 使用 字典 记录 每一张名片 的详细信息
  • 使用 列表 统一记录所有的 名片字典
  • cards_main 文件的顶部增加一个 列表变量
  1. # 所有名片记录的列表
  2. card_list = []

i.所有名片相关操作,都需要使用这个列表,所以应该 定义在程序的顶部
ii.程序刚运行时,没有数据,所以是 空列表

新增名片

功能分析

  • 提示用户依次输入名片信息
  • 将名片信息保存到一个字典
  • 将字典添加到名片列表
  • 提示名片添加完成

根据步骤实现代码

  1. def new_card(cards_list): # 新增名片
  2. print("新增名片")
  3. name_str = input("请输入姓名:")
  4. gender_str = input("请输入性别:")
  5. age_str = input("请输入年龄:")
  6. # 使用用户输入的信息建立一个名片字典
  7. cards_dict = {"name": name_str,
  8. "gender": gender_str,
  9. "age": age_str}
  10. # 将名片字典添加到列表中
  11. cards_list.append(cards_dict)
  12. print("成功增加 %s 的名片" % name_str)
  • 右键选中变量,点击 Refactor 中的 Rename,能批量修改变量名,以回车键结束

显示所有名片

功能分析

  • 循环遍历名片列表,顺序显示每一个字典的信息

代码实现

  1. def show_all(cards_list): # 显示所有名片
  2. # 判断是否存在名片记录
  3. if len(cards_list) == 0:
  4. print("提示:没有任何名片信息")
  5. return
  6. # 打印表表头信息
  7. for k in ["姓名", "性别", "年龄"]:
  8. print("%s" % k, end="\t\t")
  9. print(" ")
  10. print("-" * 50)
  11. # 遍历名片列表依次输出字典信息
  12. for cards in cards_list:
  13. # print("%s\t\t%s\t\t%s\t\t" % (cards["name"], cards["gender"], cards["age"]))
  14. for k in [cards["name"], cards["gender"], cards["age"]]:
  15. print("%s" % k.ljust(8, " "), end="")
  16. print(" ")
  17. print("-" * 50)
  • 在函数中使用 return 表示返回
  • 如果在 return 后没有跟任何内容,只是表示该函数执行到此就不再执行后续的代码

查询名片

功能分析

  • 提示用户要搜索的姓名
  • 根据用户输入的姓名遍历列表
  • 搜索到指定的名片后,再执行后续的操作

代码实现

  • 搜索名片
  1. def search_card(cards_list): # 搜索名片
  2. find_name = input("请输入要搜索的姓名:")
  3. count = -1
  4. for find in cards_list:
  5. count += 1 # 记录搜索到的姓名的索引,便于后续对名片的操作
  6. if find_name == find["name"]:
  7. for k in ["姓名", "性别", "年龄"]:
  8. print("%s" % k, end="\t\t")
  9. print(" ")
  10. print("-" * 50)
  11. for k in [find["name"], find["gender"], find["age"]]:
  12. print("%s" % k.ljust(8, " "), end="")
  13. print(" ")
  14. print("-" * 50)
  15. deal_cards(count, find, cards_list)
  16. return
  17. print("抱歉没有找到 %s,请重新输入" % find_name)
  • 处理名片
  1. def deal_cards(count, find, cards_list): # 处理名片
  2. action = input("请输入对名片的操作:1:修改/ 2:删除/ 0:返回上级菜单:")
  3. while True:
  4. if action == "1":
  5. # 如果用户没有输入内容,返回字典原有的值
  6. name_str = input("请输入姓名 [回车不修改]:")
  7. if name_str == "":
  8. name_str = find["name"]
  9. gender_str = input("请输入性别 [回车不修改]:")
  10. if gender_str == "":
  11. gender_str = find["gender"]
  12. age_str = input("请输入年龄 [回车不修改]:")
  13. if age_str == "":
  14. age_str = find["age"]
  15. find = {"name": name_str,
  16. "gender": gender_str,
  17. "age": age_str}
  18. print("%s 的名片修改成功" % find["name"])
  19. cards_list[count] = find
  20. elif action == "2":
  21. cards_list.remove(find)
  22. print("你已成功删除 %s 的信息" % find["name"])
  23. return
  24. elif action == "0":
  25. return
  26. else:
  27. action = input("输入错误,请重新输入 1:修改/ 2:删除/ 0:返回上级菜单:")
  • 由于找到的字典记录已经在列表中保存
  • 要删除名片记录,只需要把列表中对应的字典删除即可
  • 要修改名片记录,只需要把列表中对应的字典中每一个键值对的数据修改即可

03_完整代码

cards_main.py文件

  1. import cards_tools
  2. cards_list = []
  3. # TODO 需要做的事
  4. while True:
  5. num = cards_tools.show_menu()
  6. if num == 1: # 新建名片
  7. cards_tools.new_card(cards_list)
  8. elif num == 2: # 显示全部
  9. cards_tools.show_all(cards_list)
  10. elif num == 3: # 查询名片
  11. cards_tools.search_card(cards_list)
  12. elif num == 0:
  13. print("欢迎再次使用【名片管理系统】")
  14. break

cards_tools.py文件

  1. def show_menu():
  2. oper_tuple = ("退出系统", "新建名片", "显示全部", "查询名片")
  3. print("*" * 50)
  4. print("欢迎使用【名片管理系统】V1.0\n")
  5. print("1.新建名片")
  6. print("2.显示全部")
  7. print("3.查询名片\n")
  8. print("0.退出系统")
  9. print("*" * 50)
  10. num_str = input("请选择操作功能:")
  11. if num_str not in ["0", "1", "2", "3"]: # 如果输入的不在选项中
  12. print("输入错误,请重新输入")
  13. return
  14. num = int(num_str)
  15. print("你选择的操作是:%d" % num)
  16. print('-' * 50)
  17. print("功能:%s" % oper_tuple[num])
  18. return num
  19. def new_card(cards_list): # 新增名片
  20. print("新增名片")
  21. name_str = input("请输入姓名:")
  22. gender_str = input("请输入性别:")
  23. age_str = input("请输入年龄:")
  24. # 使用用户输入的信息建立一个名片字典
  25. cards_dict = {"name": name_str,
  26. "gender": gender_str,
  27. "age": age_str}
  28. # 将名片字典添加到列表中
  29. cards_list.append(cards_dict)
  30. print("成功增加 %s 的名片" % name_str)
  31. def show_all(cards_list): # 显示所有名片
  32. # 判断是否存在名片记录
  33. if len(cards_list) == 0:
  34. print("提示:没有任何名片信息")
  35. return
  36. # 打印表表头信息
  37. for k in ["姓名", "性别", "年龄"]:
  38. print("%s" % k, end="\t\t")
  39. print(" ")
  40. print("-" * 50)
  41. # 遍历名片列表依次输出字典信息
  42. for cards in cards_list:
  43. # print("%s\t\t%s\t\t%s\t\t" % (cards["name"], cards["gender"], cards["age"]))
  44. for k in [cards["name"], cards["gender"], cards["age"]]:
  45. print("%s" % k.ljust(8, " "), end="")
  46. print(" ")
  47. print("-" * 50)
  48. def search_card(cards_list): # 搜索名片
  49. find_name = input("请输入要搜索的姓名:")
  50. count = -1
  51. for find in cards_list:
  52. count += 1 # 记录搜索到的姓名的索引,便于后续对名片的操作
  53. if find_name == find["name"]:
  54. for k in ["姓名", "性别", "年龄"]:
  55. print("%s" % k, end="\t\t")
  56. print(" ")
  57. print("-" * 50)
  58. for k in [find["name"], find["gender"], find["age"]]:
  59. print("%s" % k.ljust(8, " "), end="")
  60. print(" ")
  61. print("-" * 50)
  62. deal_cards(count, find, cards_list)
  63. return
  64. print("抱歉没有找到 %s,请重新输入" % find_name)
  65. def deal_cards(count, find, cards_list): # 处理名片
  66. action = input("请输入对名片的操作:1:修改/ 2:删除/ 0:返回上级菜单:")
  67. while True:
  68. if action == "1":
  69. # 如果用户没有输入内容,返回字典原有的值
  70. name_str = input("请输入姓名 [回车不修改]:")
  71. if name_str == "":
  72. name_str = find["name"]
  73. gender_str = input("请输入性别 [回车不修改]:")
  74. if gender_str == "":
  75. gender_str = find["gender"]
  76. age_str = input("请输入年龄 [回车不修改]:")
  77. if age_str == "":
  78. age_str = find["age"]
  79. find = {"name": name_str,
  80. "gender": gender_str,
  81. "age": age_str}
  82. print("%s 的名片修改成功" % find["name"])
  83. cards_list[count] = find
  84. elif action == "2":
  85. cards_list.remove(find)
  86. print("你已成功删除 %s 的信息" % find["name"])
  87. return
  88. elif action == "0":
  89. return
  90. else:
  91. action = input("输入错误,请重新输入 1:修改/ 2:删除/ 0:返回上级菜单:")