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