名片管理系统 #python项目 #演练 #增删改查CRUD #全程教程

一、成果示例

新建,显示全部

在这里插入图片描述

查询、修改与删除

在这里插入图片描述

展示所有、退出

在这里插入图片描述

二、演练目标

  1. 新建名片
  2. 删除名片
  3. 修改名片
  4. 查询名片

三、实现步骤

1>框架搭建

  • 搭建框架结构,保证主体代码的运行
  1. 准备文件,确定文件名,保证能够在需要的位置编写代码
  2. 编写主运行循环,实现基本的用户输入和判断

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.新增名片功能

  1. 要有一个字典,装用户名片
  2. 提示用户输入
  3. 将这个字典写入列表
  4. 提示成功
  • 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.当没有任何名片时,不打印表头,显示提示并返回

  1. 用户输入名字
  2. 判断(可以用空列表的布尔值判断)
  • 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.搜索功能

  1. 根据搜索来查找名片
  2. 展示对名片的操作
  3. 又新增一个函数,展示扩展功能
  • 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函数。
  • 这个函数要能:
  1. 输入内容,返回输入的内容
  2. 未输入内容,返回字典的原值(所以传入参数时,要传入字典原值)
  3. 要有复用性,所以提示信息要不同(所以传入参数,作为提示信息)
  • 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  # 返回字典原有的值
发布了48 篇原创文章 · 获赞 30 · 访问量 4661

猜你喜欢

转载自blog.csdn.net/weixin_44925501/article/details/103215279