前言
我们之前已经学习了变量、流程控制、函数、模块等内容,接下来我们利用它们来搭建一个名片管理系统
需求
1.样式如下
**************************************************
欢迎使用【名片管理系统】V1.0
 
 
1. 新建名片
2. 显示全部
3. 查询名片
 
 
0. 退出系统
**************************************************
2.用户可以用数字选择不同功能
3.用户名片需要记录用户的 姓名、电话、QQ、邮件
4.如果查询到指定的名片,用户可以选择 修改 或者 删除 名片
步骤
1.框架搭建
2.新增名片
3.显示所有名片
4.查询名片
5.查询成功后修改、删除名片
6.让 Python 程序能够直接运行
01-框架搭建
我们在编写程序的时候,为了方便使用,应该有一个主程序和一个工具包,使得代码整洁,在这里主程序我命名为cards_main,工具包为cards_tools
这样可以使得每一次启动都从cards_main这个程序进入,而在cards_tools包里保存所有名片功能函数,如名片的 新增、查询、修改、删除 等功能
1.1 编写主循环
在cards_main中添加一个无限循环,使得每次用户在进行退出操作时才退出
while True:
    # TODO 显示功能菜单
    action_str = input("请选择希望执行的操作:")
    print("您选择的操作是:[%s]" % action_str)
    # 1,2,3针对名片的操作
    if action_str in ["1", "2", "3"]:
        # TODO 新增名片
        if action_str == "1":
            pass
        # TODO 显示全部
        elif action_str == "2":
            pass
        # TODO 查询名片
        elif action_str == "3":
            pass
    elif action_str == "0":
        print("欢迎再次使用【名片管理系统】")
        break
    else:
        print("您输入的不正确,请重新输入")
字符串的判断
if action in ["1", "2", "3"]:
if action == "1" or action == "2" or action == "3":
1.使用 in 针对 列表 判断,避免使用 or 拼接复杂的逻辑条件
2.没有使用 int 转换用户输入,可以避免 一旦用户输入的不是数字,导致程序运行出错
pass
pass 就是一个空语句,不做任何事情,一般用做占位语句,目的是为了保持程序结构的完整性

无限循环

为了不希望程序执行后 立即退出,使用while True之类的无限循环,由用户来决定退出程序的时机

TODO 注释

在 # 后跟上 TODO ,用于标记需要去做的工作

# TODO(作者/邮件) 要做的事
1.2 在cards_tools中新增四个函数
def new_card():
    """新增名片"""
    print("-" * 50)
    print("新增名片")
 
 
def show_all():
    """显示所有名片"""
    print("-" * 50)
    print("显示所有名片")
 
 
def search_card():
    """搜索名片"""
    print("-" * 50)
    print("搜索名片")
1.3 导入模块
import cards_tools
while True:
    # 显示功能菜单
    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()
 
        # 显示全部
        elif action_str == "2":
            cards_tools.show_all()
 
        # 查询名片
        elif action_str == "3":
            cards_tools.search_card()
 
    elif action_str == "0":
        print("欢迎再次使用【名片管理系统】")
        break
    
    else:
        print("您输入的不正确,请重新输入")
至此,主程序cards_main已经编写完毕,剩下的功能实现全部在cards_tools中编写
1.4 完成show_menu函数
def show_menu():
    """显示菜单"""
    print("*" * 50)
    print("欢迎使用【名片管理系统】 V 1.0")
    print()
    print("1. 新增名片")
    print("2. 显示全部")
    print("3. 查询名片")
    print()
    print("0. 退出系统")
    print("*" * 50)
 
02-确定保存名片数据的结构
首先,在写程序前,先明白用什么才存储数据,众所周知, 程序就是用来处理数据的,而变量就是用来存储数据的,所以确定使用的变量很重要
我们可以使用字典来保存每一张名片的详细信息,并用列表统一所有的名片字典
我们打开程序的时候,是没有数据的,所以应该定义一个全局列表,置空列表,方便以后使用
添加列表变量
card_list = []
03-功能实现
3.1 新增名片
def new_card():
    """新增名片"""
    print("-" * 50)
    print("新增名片")
    name_str = input("请输入姓名:")
    phone_str = input("请输入电话:")
    qq_str = input("请输入QQ:")
    email_str = input("请输入邮箱:")
    card_dict = {"name": name_str,
                 "phone": phone_str,
                 "QQ": qq_str,
                 "email": email_str}
    card_list.append(card_dict)
    print("添加用户 %s 成功!" % name_str)
技巧:在 PyCharm 中,可以使用 SHIFT + F6 统一修改变量名
3.2 显示所有名片
1.基础代码
def show_all():
 
    """显示全部"""
    print("-" * 50)
    print("功能:显示全部")
    for card_dict in card_list:
        print(card_dict)
# 整个字典都被输出了,效果不好
2.添加标题并利用 \t 进行排版
def show_all():
    """显示所有名片"""
    print("-" * 50)
    print("显示所有名片")
    # 打印表头
    for table_head in ["姓名", "电话", "QQ", "邮箱"]:
        print(table_head, end="\t\t\t")
    print()
    # 打印分隔线
    print("=" * 50)
    for card_dict in card_list:
        print("%s\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t" %
              (card_dict["name"],
               card_dict["phone"],
               card_dict["QQ"],
               card_dict["email"]))
3.增加没有名片纪录判断
def show_all():
    """显示所有名片"""
    print("-" * 50)
    print("显示所有名片")
    # 判断是否有名片纪录,如果没有则返回
    if len(card_list) == 0:
        print("当前没有任何的名片纪录,请使用新增功能添加名片")
        return
注意:return可以返回一个函数的执行结果(若后面没有任何内容,则不返回任何结果),且return后面的代码不再执行,同时返回到调用函数位置的代码,去执行调用函数下面的代码
3.3 查询名片
1.基本代码
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("=" * 50)
            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"]))
            break
    else:
        print("没有找到 %s" % find_name)
 2.添加操作函数(修改/删除)的框架
def deal_card(find_dict):
    """操作搜索到的名片字典
 
    :param find_dict:找到的名片字典
    """
    action_str = input("请选择要执行的操作 "
                       "[1] 修改 [2] 删除 [0] 返回上级菜单")
    if action == "1":
        print("修改")
    elif action == "2":
        print("删除")
3.添加删除操作
由于找到的字典记录已经在card_list列表中保存,而要删除名片记录,只需要把列表中对应的字典删除即可
elif action_str == "2":
    card_list.remove(find_dict)
    print("删除成功!")
4.添加修改操作
由于找到的字典记录已经在列表中保存,要修改名片记录,只需要把列表中对应的字典中每一个键值对的数据修改即可
if action_str == "1":
    find_dict["name"] = input("姓名:")
    find_dict["phone"] = input("电话:")
    find_dict["qq"] = input("QQ:")
    find_dict["email"] = input("邮箱:")
    print("修改成功!")
5.修改操作细化
为了方便用户在使用时,对名片内容不修改,则新定义一个input_card_info函数对input函数进行拓展
def input_card_info(dict_value, tip_message):
    """输入名片信息
 
    :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
修改原代码
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("修改成功!")
 
03-Linux上的S'he'bang符号(#!)
指明执行这个脚本文件的解释程序
1. 使用 which 查询 python3 解释器所在路径
which python3
2.在主python文件第一行添加内容
#! /usr/bin/python3
3.修改 主python 文件的文件权限,增加执行权限
chmod +x cards_main.py
4.在需要时执行程序
./cards_main.py