python yield关键字,contextlib模块

'''
整个生成器的函数并不是一次执行完毕的,而是可以持续和调用处进行沟通
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();

使用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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值