Python 创建一个简单的任务清单(to-do list)(千字长文)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在快节奏的现代生活中,任务清单(to-do list) 是管理日常事务的重要工具。无论是学生规划学习计划,还是开发者追踪项目进度,一个高效的待办事项系统都能显著提升效率。本文将通过 Python 这一易学且功能强大的编程语言,逐步演示如何从零开始构建一个简单的任务清单应用。通过代码实践,读者不仅能掌握基础的编程概念,还能理解如何将抽象需求转化为可执行的程序。
一、基础功能实现:添加、查看、删除任务
1.1 任务存储与核心数据结构
任务清单的核心是存储和操作任务数据。在 Python 中,我们可以使用 列表(List) 来动态管理任务。列表的灵活性允许我们通过索引快速增删元素,例如:
tasks = [] # 初始化空列表
def add_task(task_name):
tasks.append(task_name)
print(f"任务 '{task_name}' 已添加!")
比喻:列表就像一个活页夹,每个任务都是其中一页。append()
方法相当于在活页夹末尾插入新页面。
1.2 核心功能函数设计
接下来,我们需要实现查看任务列表和删除任务的功能。通过遍历列表并输出所有任务,用户可以随时查看当前待办事项:
def list_tasks():
if not tasks:
print("当前任务清单为空!")
return
print("任务清单:")
for index, task in enumerate(tasks, 1):
print(f"{index}. {task}")
删除任务时,需要先显示任务列表,让用户选择要删除的序号:
def delete_task():
list_tasks()
try:
index = int(input("请输入要删除的任务序号:"))
if 1 <= index <= len(tasks):
removed_task = tasks.pop(index - 1)
print(f"任务 '{removed_task}' 已删除!")
else:
print("无效的序号,请重新尝试。")
except ValueError:
print("请输入数字!")
关键点:enumerate()
函数为列表元素添加索引,pop()
方法根据索引删除元素并返回被删除的值。
二、扩展功能:任务状态管理与分类
2.1 标记任务为“已完成”
任务状态(如完成或未完成)可以通过 字典(Dictionary) 扩展存储。将每个任务封装为包含 name
和 status
的字典,例如:
tasks = [] # 现在列表中的元素是字典
def add_task(task_name):
tasks.append({"name": task_name, "status": "未完成"})
print(f"任务 '{task_name}' 已添加!")
def mark_done():
list_tasks() # 需要修改 list_tasks() 显示状态信息
try:
index = int(input("请输入要标记为已完成的序号:"))
if 1 <= index <= len(tasks):
task = tasks[index - 1]
task["status"] = "已完成"
print(f"任务 '{task['name']}' 已标记为完成!")
else:
print("无效的序号!")
except ValueError:
print("请输入数字!")
比喻:字典如同每个任务的档案袋,记录了任务名称和状态,方便随时更新。
2.2 按类别筛选任务
如果任务需要分类(如工作、学习、生活),可以在字典中添加 category
字段,并实现筛选功能:
def add_task(task_name, category="其他"):
tasks.append({"name": task_name, "category": category, "status": "未完成"})
def filter_tasks_by_category(category):
filtered = [task for task in tasks if task["category"] == category]
if not filtered:
print(f"类别 '{category}' 下暂无任务。")
else:
print(f"类别 '{category}' 的任务:")
for idx, task in enumerate(filtered, 1):
print(f"{idx}. {task['name']} - 状态:{task['status']}")
三、数据持久化:保存任务到文件
3.1 使用 JSON 格式存储
为了在程序关闭后保留任务数据,可以将任务列表序列化为 JSON 格式并写入文件。Python 的 json
模块提供了简单的方法:
import json
def save_tasks(filename="tasks.json"):
with open(filename, "w") as f:
json.dump(tasks, f, ensure_ascii=False, indent=4)
print("任务已保存!")
def load_tasks(filename="tasks.json"):
try:
with open(filename, "r") as f:
global tasks
tasks = json.load(f)
print("任务已加载!")
except FileNotFoundError:
print("未找到任务文件,将使用空列表初始化。")
tasks = []
关键点:ensure_ascii=False
允许中文正常显示,indent=4
使 JSON 文件更易读。
3.2 完整流程整合
在程序入口处,先加载已保存的任务,结束后再保存:
if __name__ == "__main__":
load_tasks()
while True:
# 主循环逻辑(后续章节会详细说明)
...
save_tasks()
四、用户交互优化:命令行界面设计
4.1 主菜单与输入验证
通过循环菜单让用户选择操作,并处理无效输入:
while True:
print("\n--- 任务清单菜单 ---")
print("1. 添加任务")
print("2. 查看任务")
print("3. 删除任务")
print("4. 标记任务为已完成")
print("5. 按类别筛选任务")
print("0. 退出")
choice = input("请输入选项:")
if choice == "1":
name = input("请输入任务名称:")
category = input("请输入任务类别(可选,默认'其他'):") or "其他"
add_task(name, category)
elif choice == "2":
list_tasks()
elif choice == "3":
delete_task()
elif choice == "4":
mark_done()
elif choice == "5":
category = input("请输入类别名称:")
filter_tasks_by_category(category)
elif choice == "0":
print("退出程序,保存数据中...")
save_tasks()
break
else:
print("无效的选项,请重新选择!")
技巧:使用 input()
的默认值简化用户输入(例如 category = input(...) or "其他"
)。
五、完整代码示例与测试
5.1 完整代码整合
以下是整合后的完整代码,包含所有功能:
import json
tasks = []
def add_task(task_name, category="其他"):
tasks.append({"name": task_name, "category": category, "status": "未完成"})
print(f"任务 '{task_name}' 已添加!")
def list_tasks():
if not tasks:
print("当前任务清单为空!")
return
print("任务清单:")
for idx, task in enumerate(tasks, 1):
print(f"{idx}. {task['name']} - 类别:{task['category']} - 状态:{task['status']}")
def delete_task():
list_tasks()
try:
index = int(input("请输入要删除的任务序号:"))
if 1 <= index <= len(tasks):
removed = tasks.pop(index - 1)
print(f"任务 '{removed['name']}' 已删除!")
else:
print("无效的序号!")
except ValueError:
print("请输入数字!")
def mark_done():
list_tasks()
try:
index = int(input("请输入要标记为完成的序号:"))
if 1 <= index <= len(tasks):
task = tasks[index - 1]
task["status"] = "已完成"
print(f"任务 '{task['name']}' 已标记为完成!")
else:
print("无效的序号!")
except ValueError:
print("请输入数字!")
def filter_tasks_by_category(category):
filtered = [t for t in tasks if t["category"] == category]
if not filtered:
print(f"类别 '{category}' 下暂无任务。")
else:
print(f"类别 '{category}' 的任务:")
for idx, t in enumerate(filtered, 1):
print(f"{idx}. {t['name']} - 状态:{t['status']}")
def save_tasks(filename="tasks.json"):
with open(filename, "w", encoding="utf-8") as f:
json.dump(tasks, f, ensure_ascii=False, indent=4)
print("任务已保存!")
def load_tasks(filename="tasks.json"):
try:
with open(filename, "r", encoding="utf-8") as f:
global tasks
tasks = json.load(f)
print("任务已加载!")
except FileNotFoundError:
print("未找到任务文件,使用空列表初始化。")
tasks = []
if __name__ == "__main__":
load_tasks()
while True:
print("\n--- 任务清单菜单 ---")
print("1. 添加任务")
print("2. 查看任务")
print("3. 删除任务")
print("4. 标记任务为已完成")
print("5. 按类别筛选任务")
print("0. 退出")
choice = input("请输入选项:")
if choice == "1":
name = input("任务名称:")
category = input("任务类别(默认'其他'):") or "其他"
add_task(name, category)
elif choice == "2":
list_tasks()
elif choice == "3":
delete_task()
elif choice == "4":
mark_done()
elif choice == "5":
category = input("筛选类别:")
filter_tasks_by_category(category)
elif choice == "0":
save_tasks()
print("程序已退出。")
break
else:
print("无效选项,请重新输入!")
5.2 测试与调试建议
- 添加任务:输入不同名称和类别,验证是否正确存储。
- 标记完成:选择任务后检查状态是否更新。
- 删除任务:确保删除后列表更新且文件同步保存。
- 文件损坏:尝试手动修改
tasks.json
内容,观察程序是否报错或恢复默认。
六、总结与扩展方向
通过本文,我们从基础列表操作开始,逐步构建了一个具备 添加、删除、标记、分类 等功能的 Python 任务清单,并实现了数据持久化。对于更复杂的场景,可以考虑以下扩展:
- 图形界面(GUI):使用 Tkinter 或 PyQt 库替代命令行交互。
- 优先级排序:为任务添加优先级字段,并支持按优先级排序。
- 定时提醒:结合时间模块,为任务设置提醒时间。
关键词总结:本文围绕“Python 创建一个简单的任务清单(to-do list)”展开,通过代码实践和分步讲解,帮助读者掌握列表、字典、文件操作等核心概念,同时提供可直接运行的完整代码。希望读者能以此为起点,探索更多 Python 应用场景!