Python入门-迭代器和生成器
迭代演示
# 传统数据生成缺陷演示,编号操作未全部使用,会占用内存 #合适的做法,是需要的时候再生产,而不是全部生成好了再用 def generator(maxnum): print("【代码执行前】") num = ("数据-{num}".format(num = i) for i in range(maxnum)) print("【代码执行后】") return num def yield_demo(maxnum): for i in range(maxnum): yield "yield数据-{num}".format(num=i) def func_old(): for i in generator(5): print(i) def func_new(): for i in yield_demo(5): print(i) if __name__ == '__main__': print("============传统自定义方法=========") print("【代码执行前】") func_old() print("【代码执行后】") print("============下面为yield方法=========") print("【代码执行前】") func_new() print("【代码执行后】") #yield是python的关键字,作用与return相似 """ ============传统自定义方法========= 【代码执行前】 【代码执行前】 【代码执行后】 数据-0 数据-1 数据-2 数据-3 数据-4 【代码执行后】 ============下面为yield方法========= 【代码执行前】 yield数据-0 yield数据-1 yield数据-2 yield数据-3 yield数据-4 【代码执行后】 """
演示2
def yield_demo(): print("【yield】代码开始执行") res = yield "yield数据" print("【yield】代码执行完毕",res) yield res def func_new(): res = yield_demo() # 获取生成器对象,内部包含yield print("输出生成器对象--默认方法:", res) print("============下面为yield方法=========") print("输出生成器对象-next方法:", next(res)) #获取返回值 print("向yield发送数据-send方法:", res.send(8)) #发送数据给yield func_new() """ 输出生成器对象--默认方法: <generator object yield_demo at 0x000001D9825CE970> ============下面为yield方法========= 【yield】代码开始执行 输出生成器对象-next方法: yield数据 【yield】代码执行完毕 8 向yield发送数据-send方法: 8 """
使用yield生成斐波那契数列
# 根据另外一个生成器创建操作序列 def fibonacci(max=99): a, b = 0, 1 while a < max: # print(a, end=",") yield b a, b = b , a+b def fibo_yield(func): yield from func if __name__ == '__main__': # fibonacci() res = fibo_yield(fibonacci(66)) for i in res: print(i, end=",") #1,1,2,3,5,8,13,21,34,55,89,
yield异常处理
# 使用contextlib模块,进行上下文管理 from contextlib import contextmanager class Message: def send(self, info): print("消息发送中") @contextmanager def message_wrap(): class __Connect: def build(self): print("connect:建立网络连接") return False def close(self): print("connect:关闭网络连接") try: conn = __Connect() if conn.build(): yield Message() #获取下一个实例 else: yield None except Exception as e: print("except连接异常:", e) finally: conn.close() if __name__ == '__main__': with message_wrap() as m: m.send("www.baidu.com") """ connect:建立网络连接 except连接异常: 'NoneType' object has no attribute 'send' connect:关闭网络连接 """
yield异常,closeing模块
from contextlib import contextmanager,closing class Connect: def __init__(self): print("connect:开始建立连接") def send(self, info): print("消息发送中") def close(self): print("connect:关闭网络连接") if __name__ == '__main__': with closing(Connect()) as c: #自动关闭功能支持 print("消息发送:www.baidu.com") """ 消息发送:www.baidu.com connect:关闭网络连接 """