feat(python进阶): 完成第三至第八课教学内容

This commit is contained in:
zhiye.sun
2026-08-07 17:14:48 +08:00
parent f7c820b0f4
commit aff05283a2
21 changed files with 3504 additions and 13 deletions

View File

@@ -0,0 +1,73 @@
# 第 2-5 课课堂练习:迭代器与生成器
#
# 请先阅读讲义并运行完整示例,再按照题目顺序完成。
# 需要生成多个结果的函数必须使用 yield不要提前创建完整结果列表。
# 不要删除题目、测试数据、预期结果和自查注释。
# 第一部分:手动使用迭代器
# 1. 定义 show_first_two_names(agents) 函数。
# 2. 使用列表推导式取得所有 Agent 名称。
# 3. 使用 iter() 把名称列表转换成迭代器,并保存为 name_iterator。
# 4. 连续调用两次 next(),分别保存第一个和第二个名称。
# 5. return 一个包含两个名称的元组。
# 6. 调用函数并保存结果,预期返回 ("代码助手", "聊天助手")。
# 第二部分:处理 StopIteration
# 1. 定义 consume_iterator(values) 函数,参数接收列表。
# 2. 使用 iter(values) 创建迭代器。
# 3. 使用 while True 持续调用 next(),把每个结果加入 result 列表。
# 4. 捕获 StopIteration 后使用 break 结束循环。
# 5. return result。
# 6. 传入 ["搜索", "终端"],预期返回相同内容的新列表。
# 7. 传入空列表 [],预期返回 [],程序不能崩溃。
# 第三部分:定义 generate_enabled_names(agents) 生成器函数
# 1. 使用 for 遍历 agents。
# 2. 只处理 enabled 为 True 的 Agent。
# 3. 使用 yield 逐个生成 Agent 名称,不要创建结果列表。
# 4. 调用函数时先把生成器对象保存为 enabled_name_generator。
# 5. 使用 list(enabled_name_generator) 收集结果并输出。
# 6. 预期结果:['代码助手', '测试助手']。
# 第四部分:定义 generate_tool_names(agents) 生成器函数
# 1. 使用两层 for外层遍历 agents内层遍历 agent.get("tools", [])。
# 2. 使用 yield 逐个生成工具名称。
# 3. 本练习不去重,重复工具也需要保留。
# 4. 使用 list() 收集生成结果。
# 5. 预期结果:['搜索', '终端', '搜索', '终端', '测试']。
# 第五部分:观察生成器只能继续向后取值
# 1. 调用 generate_enabled_names(agents) 创建一个新生成器。
# 2. 第一次使用 list() 收集并保存结果,预期有两个名称。
# 3. 对同一个生成器再次使用 list(),预期得到空列表。
# 4. 输出两次结果,并用自己的话解释第二次为什么为空。
# 注意:不要为了让第二次也有数据而重新创建生成器,本题就是观察同一个生成器。
# 第六部分:定义 main() 函数
# 1. 依次调用前面四个函数,并把返回值或生成结果保存到有意义的变量中。
# 2. 输出前两个名称、迭代器消费结果、启用名称和全部工具名称。
# 3. 完成第五部分的两次生成器收集实验。
# 4. 添加程序入口判断,直接运行本文件时调用 main()。
# 最终验收测试:
# 1. show_first_two_names(agents) 返回正确的两个名称;
# 2. consume_iterator(["搜索", "终端"]) 返回相同内容的新列表;
# 3. consume_iterator([]) 返回空列表且不报错;
# 4. generate_enabled_names() 是包含 yield 的生成器函数;
# 5. 启用名称生成结果为代码助手和测试助手;
# 6. generate_tool_names() 是包含 yield 的生成器函数;
# 7. 工具生成结果保留重复的搜索和终端;
# 8. 同一个生成器第一次收集有数据,第二次收集为空;
# 9. 生成器函数中没有先创建完整结果列表再 return。
# 完成后自查:
# 1. 是否能解释可迭代对象和迭代器的区别;
# 2. 是否知道 iter() 创建迭代器、next() 取出下一个值;
# 3. 是否知道数据取完后会出现 StopIteration
# 4. 是否理解 for 循环会自动处理 StopIteration
# 5. 是否理解 yield 会交出结果并暂停函数;
# 6. 是否知道生成器只能从当前位置继续向后执行;
# 7. 是否保留了完整题目和验收说明。