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