生成器
什么是生成器?
在函数内但凡使用yield关键字,再调用函数就不会执行函数体代码,会返回一个值,该值成为生成器,这个生成器本质上就是迭代器。
def fn(): print("我是生成器") yield 'god' generator_obj = fn() generator_obj.__iter__() # 可迭代对象 print(generator_obj.__next__()) # 迭代器对象 输出:我是生成器 god
def g_fn(): print(1111111) yield '结果1' print(222222222) yield '结果2' print(33333333) yield '结果3' print(4444444) yield '结果4' g_obj = g_fn() # 在函数内部执行一次,在遇到下一个yield时停止,且可以拿到yield的返回值 r1 = g_obj.__next__() print(r1) 输出:1111111 输出 结果1 # # 从上一次停止的位置紧接着往下,在遇到下一个yield时停止,且可以拿到yield的返回值 r2 = g_obj.__next__() print(r2) 输出:222222222 输出:结果2 r3 = g_obj.__next__() print(r3) 输出:33333333 输出:结果3
====================
如果继续输出超过定义函数的个数就会报错,可以通过try捕获异常解决,或者通过for循环解决
for v in g_obj:
print(v)
输出:
1111111
结果1
222222222
结果2
33333333
结果3
4444444
结果4
# 生成器的应用案例
# 当访问的数据资源过来,可以将数据用生成器处理,有一次只能获取所有内存的一条资源
def my_rang(min, max=0,step=1): if max == 0: min, max = max, min tag = min while True: if tag >= max: break yield tag tag += step range_obj = my_rang(5,10,3) for i in range_obj: print(i) 输出值: 5 8