在前几节课中,我们学习了编程的核心概念,如变量、数据类型、条件判断、循环和函数,是时候将这些知识组合起来,构建一个真正能解决实际问题的程序了。

(图片来源网络,侵删)
我们将通过一个经典的项目——“待办事项列表” (To-Do List)——来学习如何组织代码,并使用一个简单但功能强大的数据结构:列表。
教程 29: 构建你的第一个交互式应用 - 待办事项列表
学习目标
- 理解什么是“列表”(List)数据结构。
- 学习如何对列表进行添加、删除、查看等操作。
- 掌握如何将用户输入与程序逻辑结合。
- 完成一个可以独立运行的小型交互式程序。
第一步:什么是“列表”?
想象一下你的购物清单,上面有“牛奶”、“鸡蛋”、“面包”,这个清单就是一个“列表”,在编程中,列表也是类似的,它是一个可以存放多个项目的容器。
列表的特点:
- 有序: 项目按添加的顺序排列。
- 可变: 可以随时添加、删除或修改列表中的项目。
- 可以包含不同类型的数据: 虽然通常列表里放的是相同类型的数据(比如都是字符串),但技术上也可以混合。
在Python中,我们用方括号 [] 来创建一个列表,项目之间用逗号 分隔。

(图片来源网络,侵删)
# 创建一个空的待办事项列表
todo_list = []
# 创建一个包含一些初始项目的列表
initial_tasks = ["学习Python", "去超市购物", "给妈妈打电话"]
todo_list = initial_tasks
print("我的初始待办事项列表是:", todo_list)
第二步:为列表添加项目
一个待办事项列表最基本的功能就是能添加新的任务,我们可以使用列表的 .append() 方法。
# .append() 方法会在列表的末尾添加一个新项目
todo_list.append("完成今天的代码练习")
print("添加任务后:", todo_list)
第三步:查看列表中的所有项目
这个功能很简单,我们只需要直接打印列表变量即可。
print("\n--- 当前所有待办事项 ---")
for task in todo_list:
print(f"- {task}")
这里我们用了一个 for 循环来遍历列表中的每一项,并用 f-string 让输出更美观。
第四步:标记任务为已完成并删除
当任务完成后,我们应该能从列表中移除它,我们可以使用 .remove() 方法,它会删除列表中第一个匹配的项目。

(图片来源网络,侵删)
# 假设 "去超市购物" 已经完成了
task_to_remove = "去超市购物"
if task_to_remove in todo_list:
todo_list.remove(task_to_remove)
print(f"\n'已删除: {task_to_remove}'")
else:
print(f"\n'任务 {task_to_remove} 不在列表中。'")
print("删除任务后:", todo_list)
注意: 在使用 .remove() 之前,最好先用 if item in list: 检查一下,否则如果列表中没有这个项目,程序会报错。
第五步:整合所有功能 - 创建交互式程序
让我们把所有功能整合起来,创建一个可以和用户交互的程序,我们将使用一个 while 循环来保持程序运行,直到用户选择退出。
完整代码
# 1. 初始化一个空的待办事项列表
todo_list = []
# 2. 创建一个主循环,让程序持续运行
while True:
# 3. 显示菜单选项
print("\n--- 我的待办事项列表 ---")
print("1. 查看所有任务")
print("2. 添加新任务")
print("3. 删除已完成任务")
print("4. 退出程序")
# 4. 获取用户的选择
choice = input("请输入你的选择 (1/2/3/4): ")
# 5. 根据用户的选择执行相应的操作
if choice == '1':
# 查看所有任务
print("\n--- 所有任务 ---")
if not todo_list:
print("当前没有任务,去添加一个吧!")
else:
for index, task in enumerate(todo_list): # 使用enumerate可以同时获取索引和值
print(f"{index + 1}. {task}")
elif choice == '2':
# 添加新任务
new_task = input("请输入要添加的新任务: ")
if new_task: # 确保用户没有输入空内容
todo_list.append(new_task)
print(f"'{new_task}' 已成功添加!")
else:
print("任务不能为空!")
elif choice == '3':
# 删除任务
if not todo_list:
print("当前没有任务可以删除。")
else:
print("\n--- 当前任务列表 ---")
for index, task in enumerate(todo_list):
print(f"{index + 1}. {task}")
try:
task_num_to_remove = int(input("请输入要删除的任务编号: "))
# 检查编号是否有效
if 1 <= task_num_to_remove <= len(todo_list):
# 获取要删除的任务名称
task_to_remove = todo_list[task_num_to_remove - 1]
# 从列表中删除
todo_list.pop(task_num_to_remove - 1) # .pop() 可以通过索引删除
print(f"'{task_to_remove}' 已被删除。")
else:
print("无效的编号,请重新输入。")
except ValueError:
print("请输入有效的数字编号!")
elif choice == '4':
# 退出程序
print("\n感谢使用,再见!")
break # break 会跳出 while 循环,程序结束
else:
# 处理无效输入
print("无效的选择,请输入 1, 2, 3 或 4。")
代码解析
todo_list = []: 创建一个空列表,用来存放所有待办事项。while True:: 这是一个无限循环,它会一直运行,直到我们主动break。input(...): 这个函数会暂停程序,等待用户在键盘上输入内容,并按回车,用户输入的内容会被作为字符串返回。if/elif/else结构: 根据用户输入的choice来决定执行哪一段代码。enumerate(todo_list): 这是一个非常方便的函数,它在遍历列表时,不仅返回列表中的元素,还会返回该元素的索引(从0开始),这样我们就能为每个任务编号了。try...except ValueError: 这是一个“错误处理”结构,我们尝试将用户输入的编号转换为整数 (int()),如果用户输入的不是数字(比如输入了 "abc"),程序就会抛出ValueError异常。except块会捕获这个错误,并提示用户输入有效数字,从而防止程序崩溃。todo_list.pop(index): 这是另一种删除列表元素的方法,它通过元素的索引来删除,并且会返回被删除的元素,在这里我们用它来根据用户选择的编号来删除任务。break: 当用户选择 '4' 时,break语句会立即终止while循环,程序结束。
总结与展望
恭喜你!你已经成功构建了你的第一个功能完整的交互式应用程序,这个项目虽然简单,但它涵盖了编程中非常核心的几个概念:
- 数据结构 (列表)
- 循环 (
while,for) - 条件判断 (
if/elif/else) - 用户交互 (
input) - 错误处理 (
try/except)
下一步可以做什么?
你可以尝试为这个程序增加更多功能,
- 标记任务为“已完成”:增加一个状态,
[ ] 学习Python和[x] 学习Python。 - 编辑任务:允许用户修改已有的任务内容。
- 将任务保存到文件:这样即使程序关闭,下次打开时任务列表依然存在。
- 为任务设置优先级:高”、“中”、“低”。
编程的乐趣就在于不断迭代和改进你的作品,继续探索,你会发现编程的世界充满无限可能!
