Skip to content

Commit fa1273c

Browse files
committed
feat(generators): 添加生成器模块及相关文档
添加完整的生成器模块,包括基础概念、函数、表达式、状态管理、协程应用等内容。更新README和文档结构,完善示例代码和说明文档。 新增生成器基础教程和示例代码,包括: 1. 生成器基础概念和yield关键字使用 2. 生成器函数定义和参数传递 3. 生成器表达式语法和内存优势 4. 生成器状态保持机制 5. 生成器协程应用和调度器实现 6. 相关文档和导航链接更新 更新文档结构,添加生成器模块到教程导航菜单,修正相关链接顺序。完善示例代码的注释和运行说明。
1 parent fbf5ee9 commit fa1273c

22 files changed

Lines changed: 10481 additions & 45 deletions
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
"""
4+
生成器基础概念和yield关键字
5+
6+
本模块介绍:
7+
1. 什么是生成器
8+
2. yield关键字的基本用法
9+
3. 生成器与普通函数的区别
10+
4. 生成器的基本特性
11+
"""
12+
13+
# 1. 什么是生成器
14+
print("=== 1. 什么是生成器 ===")
15+
print("生成器是一种特殊的迭代器,它可以暂停执行并保持状态")
16+
print("使用yield关键字可以创建生成器函数")
17+
print()
18+
19+
# 2. 最简单的生成器函数
20+
def simple_generator():
21+
"""最简单的生成器函数"""
22+
print("生成器开始执行")
23+
yield 1
24+
print("生成器继续执行")
25+
yield 2
26+
print("生成器即将结束")
27+
yield 3
28+
print("生成器执行完毕")
29+
30+
print("=== 2. 简单生成器示例 ===")
31+
# 创建生成器对象
32+
gen = simple_generator()
33+
print(f"生成器对象: {gen}")
34+
print(f"生成器类型: {type(gen)}")
35+
print()
36+
37+
# 使用next()函数获取值
38+
print("使用next()函数逐个获取值:")
39+
try:
40+
print(f"第一次调用next(): {next(gen)}")
41+
print(f"第二次调用next(): {next(gen)}")
42+
print(f"第三次调用next(): {next(gen)}")
43+
print(f"第四次调用next(): {next(gen)}") # 这里会抛出StopIteration异常
44+
except StopIteration:
45+
print("生成器已耗尽,抛出StopIteration异常")
46+
print()
47+
48+
# 3. 生成器与普通函数的区别
49+
def normal_function():
50+
"""普通函数"""
51+
print("普通函数执行")
52+
return [1, 2, 3]
53+
54+
def generator_function():
55+
"""生成器函数"""
56+
print("生成器函数执行")
57+
yield 1
58+
yield 2
59+
yield 3
60+
61+
print("=== 3. 生成器与普通函数的区别 ===")
62+
print("普通函数调用:")
63+
result = normal_function()
64+
print(f"返回值: {result}")
65+
print(f"类型: {type(result)}")
66+
print()
67+
68+
print("生成器函数调用:")
69+
gen_result = generator_function()
70+
print(f"返回值: {gen_result}")
71+
print(f"类型: {type(gen_result)}")
72+
print()
73+
74+
# 4. 使用for循环遍历生成器
75+
print("=== 4. 使用for循环遍历生成器 ===")
76+
gen2 = generator_function()
77+
print("使用for循环遍历:")
78+
for value in gen2:
79+
print(f"获取到值: {value}")
80+
print()
81+
82+
# 5. 生成器的惰性求值特性
83+
def fibonacci_generator(n):
84+
"""斐波那契数列生成器"""
85+
print(f"开始生成斐波那契数列,前{n}项")
86+
a, b = 0, 1
87+
count = 0
88+
while count < n:
89+
print(f"生成第{count + 1}项: {a}")
90+
yield a
91+
a, b = b, a + b
92+
count += 1
93+
print("斐波那契生成器执行完毕")
94+
95+
print("=== 5. 斐波那契数列生成器 ===")
96+
fib_gen = fibonacci_generator(5)
97+
print("创建生成器对象(此时还未开始执行)")
98+
print()
99+
100+
print("开始遍历生成器:")
101+
for fib_num in fib_gen:
102+
print(f"斐波那契数: {fib_num}")
103+
print()
104+
105+
# 6. 生成器的状态保持
106+
def counter_generator():
107+
"""计数器生成器,演示状态保持"""
108+
count = 0
109+
while True:
110+
count += 1
111+
print(f"当前计数: {count}")
112+
yield count
113+
114+
print("=== 6. 生成器的状态保持 ===")
115+
counter = counter_generator()
116+
print("获取前5个计数值:")
117+
for i in range(5):
118+
value = next(counter)
119+
print(f"计数值: {value}")
120+
print()
121+
122+
print("暂停一下,然后继续获取:")
123+
for i in range(3):
124+
value = next(counter)
125+
print(f"继续计数: {value}")
126+
print()
127+
128+
# 7. yield的返回值
129+
def echo_generator():
130+
"""回声生成器,演示yield的返回值"""
131+
while True:
132+
received = yield
133+
if received is not None:
134+
print(f"收到消息: {received}")
135+
yield f"回声: {received}"
136+
137+
print("=== 7. yield的返回值 ===")
138+
echo = echo_generator()
139+
next(echo) # 启动生成器
140+
141+
# 发送消息给生成器
142+
response = echo.send("Hello")
143+
print(f"生成器响应: {response}")
144+
145+
response = echo.send("World")
146+
print(f"生成器响应: {response}")
147+
print()
148+
149+
# 8. 生成器的内存优势演示
150+
def memory_efficient_range(n):
151+
"""内存高效的范围生成器"""
152+
i = 0
153+
while i < n:
154+
yield i
155+
i += 1
156+
157+
print("=== 8. 生成器的内存优势 ===")
158+
print("比较列表和生成器的内存使用:")
159+
160+
# 使用列表(占用更多内存)
161+
large_list = list(range(1000000))
162+
print(f"列表大小: {len(large_list)} 个元素")
163+
164+
# 使用生成器(占用很少内存)
165+
large_gen = memory_efficient_range(1000000)
166+
print(f"生成器对象: {large_gen}")
167+
print("生成器只在需要时才生成值,节省内存")
168+
print()
169+
170+
# 9. 生成器的基本方法
171+
print("=== 9. 生成器的基本方法 ===")
172+
def demo_generator():
173+
"""演示生成器方法的生成器"""
174+
try:
175+
yield 1
176+
yield 2
177+
yield 3
178+
except GeneratorExit:
179+
print("生成器被关闭")
180+
finally:
181+
print("生成器清理工作")
182+
183+
gen_demo = demo_generator()
184+
print(f"next(): {next(gen_demo)}")
185+
print(f"next(): {next(gen_demo)}")
186+
187+
# 关闭生成器
188+
gen_demo.close()
189+
print("生成器已关闭")
190+
191+
try:
192+
next(gen_demo)
193+
except StopIteration:
194+
print("关闭后的生成器无法继续使用")
195+
print()
196+
197+
print("=== 生成器基础概念学习完成 ===")
198+
print("关键要点:")
199+
print("1. yield关键字创建生成器函数")
200+
print("2. 生成器具有惰性求值特性")
201+
print("3. 生成器可以保持执行状态")
202+
print("4. 生成器比列表更节省内存")
203+
print("5. 生成器是一次性的迭代器")
204+
205+
if __name__ == "__main__":
206+
print("\n=== 运行完成 ===")
207+
print("本模块演示了生成器的基础概念和yield关键字的使用")

0 commit comments

Comments
 (0)