Python yield keyword, contextlib module

'''
整个生成器的函数并不是一次执行完毕的,而是可以持续和调用处进行沟通
return 只是返回你一次调用;
'''
def generator():
    print("yield代码执行前");
    # 与return类似,都是可以返回数据的
    res = yield "奥利给--001";
    print("yield代码执行后: res = {}".format(res));
    yield "奥利给--002:{}".format(res);

def main():
    # 获取生成器
    result = generator();
    print("调用next函数获取yield返回内容: {}".format(next(result)));
    print("向yield发送数据: {}".format(result.send(125)));


if __name__ == '__main__':
    main();
# 利用yield主要是避免内存空间被过于占用
def generator(maxNum):
    for item in range(1,maxNum):
        print("*** start ***");
        yield "奥利给——001{num:0>20}".format(num = item);
        print("*** end ***");

def main():
    for item in generator(10):
        print(item);


if __name__ == '__main__':
    main();
# 使用yield生成斐波那契数列
def finbonacci(max = 99):
    num_a,num_b = 0,1;
    while num_b < max:
        yield num_b;
        num_a,num_b = num_b,num_a + num_b;

def finbonacci_wrapper(fun_iterable):
    yield from fun_iterable;

def main():
    wrap = finbonacci_wrapper(finbonacci(66));
    for item in wrap:
        print(item);

if __name__ == '__main__':
    main();

Use contextlib

from contextlib import contextmanager;

class Message:
    def send(self,info):
        print("Message消息发送 :{}".format(info));

@contextmanager
def message_wrap():
    class _Connext:
        def build(self):
            print("connect 建立网络连接");
        def close(self):
            print("connect 关闭网络连接");

    try:
        conn = _Connext();
        if conn.build():
            yield Message();
        else:
            yield None;
    except:
        print("连接出现异常");
    finally:
        conn.close();

def main():
    with message_wrap() as msg:
        msg.send("123123");

if __name__ == '__main__':
    main();
from contextlib import closing;
# 使用closing 提供了自动关闭的操作支持
class Connect:
    def build(self):
        print("connect 建立网络连接");
    def close(self):
        print("connect 关闭网络连接");


def main():
    with closing(Connect()) as conn:
        print("消息发送 123123");

if __name__ == '__main__':
    main();
from contextlib import contextmanager,suppress;

class Message:
    def send(self,info):
        print("Message消息发送 :{}".format(info));

@contextmanager
def message_wrap():
    class _Connext:
        def build(self):
            print("connect 建立网络连接");
        def close(self):
            print("connect 关闭网络连接");

    try:
        conn = _Connext();
        if conn.build():
            yield Message();
    finally:
        conn.close();

def main():
    # 压制异常
    with suppress(RuntimeError,TypeError):
        with message_wrap() as msg:
            msg.send("123123");

if __name__ == '__main__':
    main();

Guess you like

Origin blog.csdn.net/weixin_44887276/article/details/114634358
Recommended