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:关闭网络连接
"""

 

posted @ 2021-08-21 17:05  zwx901323  阅读(57)  评论(0)    收藏  举报