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) 扩展存储。将每个任务封装为包含 namestatus 的字典,例如:

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 测试与调试建议

  1. 添加任务:输入不同名称和类别,验证是否正确存储。
  2. 标记完成:选择任务后检查状态是否更新。
  3. 删除任务:确保删除后列表更新且文件同步保存。
  4. 文件损坏:尝试手动修改 tasks.json 内容,观察程序是否报错或恢复默认。

六、总结与扩展方向

通过本文,我们从基础列表操作开始,逐步构建了一个具备 添加、删除、标记、分类 等功能的 Python 任务清单,并实现了数据持久化。对于更复杂的场景,可以考虑以下扩展:

  • 图形界面(GUI):使用 Tkinter 或 PyQt 库替代命令行交互。
  • 优先级排序:为任务添加优先级字段,并支持按优先级排序。
  • 定时提醒:结合时间模块,为任务设置提醒时间。

关键词总结:本文围绕“Python 创建一个简单的任务清单(to-do list)”展开,通过代码实践和分步讲解,帮助读者掌握列表、字典、文件操作等核心概念,同时提供可直接运行的完整代码。希望读者能以此为起点,探索更多 Python 应用场景!

最新发布