Files
PythonLearn/02_python进阶/2_5_迭代器与生成器/practice.py

74 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第 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. 是否保留了完整题目和验收说明。