迭代演示

# 传统数据生成缺陷演示,编号操作未全部使用,会占用内存
#合适的做法,是需要的时候再生产,而不是全部生成好了再用
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:关闭网络连接
"""

Python入门-迭代器和生成器的更多相关文章

  1. python基础—迭代器、生成器

    python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...

  2. python之迭代器与生成器

    python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...

  3. Python之迭代器和生成器

    Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...

  4. 【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  5. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  6. Python之迭代器,生成器

    迭代器 1.什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. from collections import Iterable l = [1,2,3,4] t ...

  7. python之迭代器、生成器与面向过程编程

    目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...

  8. day13 python学习 迭代器,生成器

    1.可迭代:当我们打印 print(dir([1,2]))   在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...

  9. Python之迭代器及生成器

    一. 迭代器 1.1 什么是可迭代对象 字符串.列表.元组.字典.集合 都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? from collections import Itera ...

随机推荐

  1. ASP.NET Core 6框架揭秘实例演示[21]:如何承载你的后台服务

    借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中.任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,A ...

  2. 假设检验的python实现命令——Z检验、t检验、F检验

    Z检验 statsmodels.stats.weightstats.ztest() import statsmodels.stats.weightstats as sw 参数详解: x1:待检验数据集 ...

  3. 【死磕NIO】— 跨进程文件锁:FileLock

    大家好,我是大明哥,一个专注于[死磕 Java]系列创作的程序员. [死磕 Java ]系列为作者「chenssy」 倾情打造的 Java 系列文章,深入分析 Java 相关技术核心原理及源码 死磕 ...

  4. 一文让你明白CPU上下文切换

    我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行.当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时 ...

  5. Linux不常用参数(持续更新)

    一.系统级别 1.1 > 使其他机器无法ping通你的主机 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all---------------- ...

  6. 前端知识之css样式

    前端之CSS样式 css介绍 css是为html标签设置样式的 css由选择器和声明组成 声明包括属性和属性值 声明之间用分号:隔开 css注释 /注释类容/ css的几种引入方式 行内样式 不推荐使 ...

  7. ModelSim10.7安装破解教程

    我打算开始学习ZYNQ,所以先安装好工具ModelSim10.7,很无奈的是倒腾了一个上午也没生产license的txt文档和破解成功. 上面是破解失败的截图,下面是生成不了license,点了直接闪 ...

  8. 在Windows11使用WSA运行Google play会遇到的问题

    前提一是要有adb工具 网盘链接:https://pan.baidu.com/s/1MAdq4GsxkW7dqq689d_gQw 提取码:24q2 前提二是会使用 MagiskOnWSA--解决了两个 ...

  9. MVC与MVVM?

    model-数据层 view-视图层 controller-控制层 MVC的目的是实现M和V的分离,单向通信,必须通过C来承上启下 MVVM中通过VM(vue中的实例化对象)的发布者-订阅者模式实现双 ...

  10. jQuery--筛选【查找函数】

    查找函数介绍 <A> <B> <C></C> <D></D> <E></E> <F>< ...