来源:黑马程序员Python基础课程 + 原创项目设计


一、详细讲解

1.1 项目概述

名片管理系统是一个经典的 Python 入门综合项目,涉及:

  • 字典存储名片数据
  • 无限循环 while True 实现菜单
  • 函数封装增删改查操作
  • if-elif 多重分支处理用户选择

1.2 数据结构设计

# 名片数据结构(字典)
card = {
    "name": "张三",
    "phone": "13800138000",
    "email": "zhangsan@example.com",
    "company": "百度公司"
}

# 名片列表(所有名片存储在列表中)
cards_list = [
    {"name": "张三", "phone": "13800138000", "email": "zhangsan@example.com", "company": "百度"},
    {"name": "李四", "phone": "13900139000", "email": "lisi@example.com", "company": "阿里"},
]

1.3 核心函数实现

# ========== 1. 显示菜单 ==========
def show_menu():
    print("=" * 50)
    print("  名片管理系统 V1.0")
    print("  1. 新增名片")
    print("  2. 显示全部")
    print("  3. 搜索名片")
    print("  4. 修改名片")
    print("  5. 删除名片")
    print("  0. 退出系统")
    print("=" * 50)

# ========== 2. 新增名片 ==========
def add_card(cards):
    name = input("请输入姓名:")
    phone = input("请输入电话:")
    email = input("请输入邮箱:")
    company = input("请输入公司:")
    
    card = {
        "name": name,
        "phone": phone,
        "email": email,
        "company": company
    }
    cards.append(card)
    print(f"√ 名片「{name}」添加成功!")

# ========== 3. 显示全部名片 ==========
def show_all(cards):
    if len(cards) == 0:
        print("当前没有任何名片,请先添加!")
        return
    
    print(f"共找到 {len(cards)} 张名片:")
    print("-" * 60)
    for card in cards:
        print(f"姓名:{card['name']}")
        print(f"电话:{card['phone']}")
        print(f"邮箱:{card['email']}")
        print(f"公司:{card['company']}")
        print("-" * 60)

# ========== 4. 搜索名片 ==========
def search_card(cards):
    if len(cards) == 0:
        print("当前没有任何名片!")
        return None
    
    search_name = input("请输入要搜索的姓名:")
    results = [c for c in cards if c["name"] == search_name]
    
    if results:
        print(f"找到 {len(results)} 张名片:")
        for card in results:
            print(f"  姓名:{card['name']},电话:{card['phone']}")
        return results
    else:
        print(f"没有找到名为「{search_name}」的名片")
        return None

# ========== 5. 修改名片 ==========
def modify_card(cards):
    if len(cards) == 0:
        print("当前没有任何名片!")
        return
    
    search_name = input("请输入要修改的姓名:")
    for card in cards:
        if card["name"] == search_name:
            print("请输入新的信息(直接回车保留原值):")
            new_phone = input(f"电话[{card['phone']}]:")
            new_email = input(f"邮箱[{card['email']}]:")
            new_company = input(f"公司[{card['company']}]:")
            
            if new_phone:
                card["phone"] = new_phone
            if new_email:
                card["email"] = new_email
            if new_company:
                card["company"] = new_company
            
            print(f"√ 名片「{search_name}」修改成功!")
            return
    
    print(f"没有找到名为「{search_name}」的名片")

# ========== 6. 删除名片 ==========
def delete_card(cards):
    if len(cards) == 0:
        print("当前没有任何名片!")
        return
    
    search_name = input("请输入要删除的姓名:")
    for i, card in enumerate(cards):
        if card["name"] == search_name:
            confirm = input(f"确定删除名片「{search_name}」?(y/n):")
            if confirm.lower() == "y":
                cards.pop(i)
                print(f"√ 名片「{search_name}」已删除!")
            return
    
    print(f"没有找到名为「{search_name}」的名片")

1.4 主程序循环

def main():
    cards = []  # 存储所有名片的列表
    
    while True:
        show_menu()
        user_choice = input("请选择操作(0-5):")
        
        if user_choice == "1":
            add_card(cards)
        elif user_choice == "2":
            show_all(cards)
        elif user_choice == "3":
            search_card(cards)
        elif user_choice == "4":
            modify_card(cards)
        elif user_choice == "5":
            delete_card(cards)
        elif user_choice == "0":
            print("感谢使用,再见!")
            break
        else:
            print("无效选择,请输入 0-5 之间的数字")

if __name__ == "__main__":
    main()

1.5 运行效果示例

================================================== 名片管理系统 V1.0 1. 新增名片 2. 显示全部 3. 搜索名片 4. 修改名片 5. 删除名片 0. 退出系统 ================================================== 请选择操作(0-5):1 请输入姓名:张三 请输入电话:13800138000 请输入邮箱:zhangsan@example.com 请输入公司:百度公司 √ 名片「张三」添加成功! 请选择操作(0-5):2 共找到 1 张名片: ------------------------------------------------------------ 姓名:张三 电话:13800138000 邮箱:zhangsan@example.com 公司:百度公司 ------------------------------------------------------------ 请选择操作(0-5):0 感谢使用,再见!

1.6 模块化改进(进阶)

将代码拆分为多个文件:

# cards_tools.py(工具模块)

cards_db = []  # 全局名片列表

def add(name, phone, email, company):
    """新增名片"""
    cards_db.append({
        "name": name,
        "phone": phone,
        "email": email,
        "company": company
    })

def get_all():
    """获取所有名片"""
    return cards_db

def find_by_name(name):
    """按姓名查找"""
    return [c for c in cards_db if c["name"] == name]

def delete(name):
    """删除名片"""
    for i, card in enumerate(cards_db):
        if card["name"] == name:
            return cards_db.pop(i)
    return None

# cards_main.py(主程序)
from cards_tools import add, get_all, find_by_name, delete

def main():
    add("张三", "138", "z@x.com", "百度")
    add("李四", "139", "l@x.com", "阿里")
    
    for card in get_all():
        print(card["name"])

if __name__ == "__main__":
    main()

二、背诵版

名片数据结构 → {"name": "", "phone": "", "email": "", "company": ""} 名片存储 → 列表 cards = [] 菜单循环 → while True + if-elif 处理选择 新增 → cards.append(字典) 删除 → cards.pop(index) 或 remove() 搜索 → [c for c in cards if c["name"] == name] 修改 → 直接赋值或 input() 保留原值 退出 → break

三、考前记忆

概念 要点
数据结构 字典存单张名片,列表存所有名片
无限循环 while True + break 退出
用户交互 input() 输入 + print() 输出
搜索功能 列表推导式或 for 循环遍历
修改确认 删除旧数据 + append 新数据
模块化 函数封装 + import 分离代码

四、测试题

1. 单选题: 名片管理系统的名片数据结构是?

  • A. 字符串
  • B. 列表
  • C. 字典
  • D. 集合

2. 单选题: 无限循环菜单通常用什么退出?

  • A. exit()
  • B. break
  • C. continue
  • D. return

3. 判断题: while True 构成的循环如果不加 break 会永远执行下去。

4. 填空题: 删除列表中第 i 个元素用 ______ 方法。

5. 简答题: 说明 while True 无限循环和 for i in range(n) 循环的区别及各自适用场景。

6. 代码题: 在名片列表 cards = [{"name":"张三","phone":"138"},{"name":"李四","phone":"139"}] 中,查找并返回姓名为"李四"的名片,没有找到返回 None。

  1. C(字典存储单张名片的多维信息)
  2. Bbreak 跳出循环)
  3. pop(i)
  4. while True 适合不确定循环次数(菜单、等待用户输入),for 适合已知循环次数(遍历有限序列)。
  5. def search_by_name(cards, name):
        for card in cards:
            if card["name"] == name:
                return card
        return None
    
    result = search_by_name(cards, "李四")
    print(result)  # {"name":"李四","phone":"139"}