点击蓝字 关注我们



上一课学完递归之后,Tyree感觉自己已经掌握了Python的绝大部分基础语法。但他问了一个问题:“我能用这些语法做出一个真正能用的东西吗?”
他说得对。学完语法,不能只是做练习题。需要做一个真正能解决实际问题的工具。
今天的课程,我们用列表、文件读写、函数、循环、条件判断等知识,做一个待办清单程序。它能帮你记录每天要做的事,添加、查看、完成,关掉再打开数据还在。
1
功能设计
先想好这个程序要做什么。Tyree每天有这些需求:
1. 添加任务:想到一件事就记下来
2. 查看任务:看看还有哪些事没做
3. 完成任务:做完一件事就从清单里删掉
4. 退出:关掉程序后,数据还在,下次打开接着用
这四种操作对应了程序的四个功能。Tyree说:“就像手机里的便签,但这是我用代码自己写的。”
2
数据结构
程序需要存多个任务,用列表最合适。
todos = ["写作业", "练琴", "背单词"]
每个任务就是列表里的一项,是个字符串。添加任务就是往列表里 `append`,完成任务就是从列表里 `remove` 或 `pop`。
查看任务就是遍历列表,给每个任务加一个编号,方便用户操作。Tyree说:“编号不用存在列表里,在遍历的时候用 `enumerate` 临时生成就行。”
print(f"{i}. {task}")
3
加载和保存(文件读写)
程序关了之后,列表里的数据就没了。所以需要存到文件里。
为什么用文件?因为文件存在硬盘里,程序关了也不会丢。数据量小、读写简单,直接用文本文件就可以了。程序启动时从文件加载,退出时自动保存。
import os
def load_todos():
todos = []
if os.path.exists("todos.txt"):
with open("todos.txt", "r") as f:
for line in f:
todos.append(line.strip())
return todos
def save_todos(todos):
with open("todos.txt", "w") as f:
for item in todos:
f.write(item + "\n")
解释:
- `os.path.exists()` 用来检查文件是否存在。第一次运行时没有文件,直接返回空列表,不会报错。
- `line.strip()` 去掉行末的换行符 `\n`。因为读进来的时候每行末尾都有换行,不处理的话任务名称后面会多出一个看不见的换行。
- 保存时,`item + "\n"` 让每个任务占一行,方便下次逐行读取。
4
添加任务
def add_todo(todos):
task = input("请输入任务:")
todos.append(task)
print(f"已添加:{task}")
解释:
这个函数只做了三件事:让用户输入、追加到列表、打印提示。Tyree说:“存进列表只是暂时的,后面主程序退出时会统一保存到文件,所以这里不用单独写保存操作。”
如果用户输入为空怎么办?目前程序没有限制,空字符串也会被添加。可以把 `input` 改成 `while` 循环判断输入是否为空,但在当前版本里先保持简单。
5
查看任务
def show_todos(todos):
if not todos:
print("暂无任务")
return
print("\n===== 待办清单 =====")
for i, task in enumerate(todos, 1):
print(f"{i}. {task}")
print("===================\n")
解释:
- `if not todos` 检查列表是否为空。空列表在条件判断中是 `False`。如果为空,打印“暂无任务”并直接 `return`,不继续执行后面的代码。
- `enumerate(todos, 1)` 的作用:`enumerate` 是Python内置函数,遍历列表时同时返回索引和值。
`1` 表示编号从1开始(默认从0开始)。这样用户看到的是从1开始的编号,更符合直觉。
6
完成任务
def complete_todo(todos):
show_todos(todos)
try:
num = int(input("请输入要完成的任务编号:"))
if 1 <= num <= len(todos):
removed = todos.pop(num - 1)
print(f"已完成:{removed}")
else:
print("编号无效")
except ValueError:
print("请输入数字")
解释:
- `show_todos(todos)` 先调用查看函数,让用户看到当前清单,再选择要完成哪一项。
-`try...except` 处理用户输入非数字的情况。如果用户输入“abc”,`int("abc")` 会报错,`except` 捕获后提示“请输入数字”,程序不会崩溃。
- `pop(num - 1)` 删除列表中指定位置的元素并返回它。为什么是 `num - 1`?因为用户看到的编号从1开始,但列表索引从0开始,所以需要减1。
- `removed` 保存了被删除的任务名称,用来打印“已完成:xxx”。Tyree说:“这样有成就感,知道具体完成了哪件事。”
主程序脚本:
def main():
todos = load_todos()
while True:
print("\n1. 添加任务")
print("2. 查看任务")
print("3. 完成任务")
print("4. 退出")
choice = input("请选择(1-4):")
if choice == "1":
add_todo(todos)
elif choice == "2":
show_todos(todos)
elif choice == "3":
complete_todo(todos)
elif choice == "4":
save_todos(todos)
print("已保存,再见!")
break
else:
print("无效选择")
if __name__ == "__main__":
main()
解释:
- `todos = load_todos()` 程序启动时,先把文件里的任务加载到内存。
- `while True` 一直循环,直到用户选择“退出”。
- 四个选项分别调用四个函数。
- 选择“退出”时,调用 `save_todos(todos)` 保存所有任务到文件,然后 `break` 跳出循环,程序结束。
- `if __name__ == "__main__":` 确保只有直接运行这个文件时才执行 `main()`,如果被其他文件导入则不会自动运行。
7
完整代码
把上面的各分组代码汇总在一起,就是完整代码啦。
运行后就可以添加备忘然后一项一项的加,添加后可以查看任务执行情况。
下面是运行后的截图,

挑战:
增加“标记任务优先级”功能,用字典存储任务+优先级(高/中/低)。
8
今天学到了什么
- 待办清单程序串联了列表、循环、条件判断、函数、文件读写这些基础语法
- 程序启动时从文件加载数据,退出时保存到文件
- `enumerate()` 让遍历列表时同时拿到索引和值
- `pop()` 删除指定位置的元素并返回它
- `try...except` 处理用户输入错误
- `os.path.exists()` 检查文件是否存在
- `if __name__ == "__main__":` 控制程序入口
好了,今天就到这,欢迎点赞关注收藏!
明天第90课:学生成绩管理系统——用字典和文件管理全班成绩
————热门推荐————
自学编程第51课:爬虫入门让Python帮你从网页“拿”数据
自学编程第一步:安装Python和Thonny 零基础图文教程
本系列教程持续更新,欢迎关注收藏

点赞
收藏
分享