来源:黑马程序员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。
- C(字典存储单张名片的多维信息)
- B(
break跳出循环) - ✓
pop(i)while True适合不确定循环次数(菜单、等待用户输入),for适合已知循环次数(遍历有限序列)。-
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"}