def simple_generator():
yield 1
yield 2
yield 3
gen = simple_generator()
print(next(gen)) # 输出:1
print(next(gen)) # 输出:2
print(next(gen)) # 输出:3
# print(next(gen)) # 再次调用会引发StopIteration异常
gen_expr = (x * x for x in range(3))
print(next(gen_expr)) # 输出:0
print(next(gen_expr)) # 输出:1
print(next(gen_expr)) # 输出:4
-
惰性求值(延迟计算):生成器需要时才会生成数据,节省内存,对处理大数据集非常有用。(对于一个数据集,发现某单个数据就挂起,而不要从头开始查找) -
简洁易读:使用 yield 关键字编写生成器函数,比手动实现迭代器类更加简洁。 - 无状态保存:生成器自动保存函数执行状态,无需手动管理迭代器的状态。
使用’for’循环遍历生成器
生成器可以与 for 循环结合使用,无需显式调用 next() 函数,并且在生成器耗尽时自动处理 StopIteration 异常。
def countdown(n):
while n > 0:
yield n
n -= 1
for num in countdown(5):
print(num)
生成器的高级特性
‘send()’方法
生成器不仅可以通过 next() 函数获取值,还可以通过 send() 方法向生成器发送值。
‘close()’方法
close() 方法用于关闭生成器,终止其迭代。
‘throw()’方法
throw() 方法用于向生成器内部引发异常。
迭代器和生成器分别在什么样的场景使用?
- 生成器:适用于按需生成数据、简化迭代器实现、处理复杂迭代逻辑、数据流水线处理。生成器使代码简洁,并节省内存。(简单)
- 迭代器:适用于需要完整的迭代器协议、维护复杂对象状态、组合多个迭代器的场景。迭代器类提供更多的灵活性和控制。(复杂)
代码地带
生成器生成斐波那契数列
def fibonacci(limli):
a, b = 0, 1
while a < limli:
yield a
a, b = b, a + b
for num in fibonacci(200):
print(num)
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/87845.html