迭代演示

# 传统数据生成缺陷演示,编号操作未全部使用,会占用内存
#合适的做法,是需要的时候再生产,而不是全部生成好了再用
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. php 23种设计模型 - 享元模式

    享元模式 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...

  2. XSS攻击防范

    前端安全系列之XSS攻击防范 1.使用textContent 2.使用HTML转义 把JS中的标签转成字符 3.对于链接跳转 禁止含有'javascript:'开头的字符 4.标签属性中含有恶意执行代 ...

  3. 当.Net撞上BI可视化,这3种“套路”你必须知道

    最近葡萄在做技术支持,又遇到了客户给我们出的新问题. 事情是这样的. 这次客户使用的是.Net项目,直接做BI大屏过于复杂,所以想直接集成使用BI数据可视化分析大屏. 所以,这次我们就从--Wyn出发 ...

  4. 【一】工程配置与电机控制part1

    前言 学校发的无刷电机: 我们准备的有刷电机: 带霍尔编码器! 电机参数: 名称:驰名电机(直流减速电机) 型号:JGA25-370 电压:12V 转数:1360r/min 做云台,核心是使用PID控 ...

  5. LGP4916题解

    第一眼,Burnside 直接丢上去啊. 设 \(f(n,m)\) 是有 \(n-m\) 个白色珠子和 \(m\) 个白色珠子的满足题意的环的个数,容易得到答案是: \[\sum_{d|n,d|m}f ...

  6. Docker 学习之命令篇

      Docker 学习之命令篇 1. docker images //镜像列表 2. docker ps –a //所有运行过的容器 3. docker ps –l 最后运行的容器 4. docker ...

  7. Django 之 modelForm (edit.html页面的编写)

    models.py文件 from django.db import models # Create your models here. from django.db import models # C ...

  8. windows server 2008r2 在vmware里自动关机

    虚拟机没有激活所以导致自动关机,试试激活它.<wiz_tmp_tag id="wiz-table-range-border" contenteditable="fa ...

  9. 用Markdown写Html和.md也就图一乐,真骚操作还得用来做PPT

    前言 和这篇文章一样,我就是用Markdown写的.相信各位平时也就用Markdown写写文档,做做笔记,转成XHtml.Html等,今天教大伙一招骚操作:用Markdown写PPT. 绝大多数朋友做 ...

  10. Spring Data Jpa 更新操作

    第一步,通过Repository对象把实体根据ID查询出来 第二部,往查出来的实体对象进行set各个字段 第三步,通过Repository接口的save方法进行保存 保存和更新方式(已知两种) 第一种 ...