Python中生成器generator和迭代器Iterator的使用方法
一、生成器
1. 生成器的定义
- 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间
2. 生成器的创建方式
- 第一种只要把一个列表生成式的 [ ] 改成 ( )
ret = (n + 1 for n in range(0,10))
# 返回值是生成了一个生成器对象<genexpr>储存在16进制的地址中<generator object <genexpr> at 0x7f909f4be150>
# 如果调用次数超过生成器内值的总数量,会报错
- 第二种方法使用yield创建生成器
- 只要在一个函数中存在至少一个yield关键字,该函数就不是普通函数,是一个生成器
- 返回一个对象,需要使用变量接收
- 生成器可以用for进行遍历得到所有的值
# 定义一个斐波那契数列的生成器
def creatnum():print('-----start------')a,b = 0,1for i in range(5):print('----1-----')# 每次执行函数都会停在此处,并将b值返回yield bprint('----2-----')a,b = b,a+bprint('----3-----')print('-----stop-----')f = creatnum()
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
- 打印结果
-----start------
----1-----
1
----2-----
----3-----
----1-----
1
----2-----
----3-----
----1-----
2
----2-----
----3-----
----1-----
3
----2-----
----3-----
----1-----
5
3. 启动生成器的方法
- 第一种:
next(生成器的名称)
- 第二种:
# 生成器第一次调用时尽量不要使用send,非要使用必须用send(None)
send()方法
二、迭代器
可迭代数据类型(具有可迭代功能)
- 把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)
例如:列表,元组,字典,集合等数据类型,但他们不是可迭代对象 - generator(生成器)
- yield
- 列表生成器
- 生成器都是可迭代对象
- 把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)
如何判断一个对象是不是有可迭代功能
from collections import Iterator # 列表是可迭代的 result = isinstance([1,2], Iterable) print(result) # isinstance函数会返回一个bool值 True为可迭代,反之False
将具有迭代功能的数据类型转化为可迭代器
- 可以被next()调用并不断返回下一个值的对象称之为迭代器Iterator
迭代器的判断方式
from collections import Iterator # 列表是可迭代对象 # isinstance函数会返回一个bool值 True为迭代器,反之False result = isinstance([1,2], Iterator) print(result)
可迭代对象的本质
我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么,在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为迭代器(Iterator)。
可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。
可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.
那么也就是说,一个具备了__iter__方法的对象,就是一个可迭代对象。
from collections import Iterable # 使用isinstance() 函数检测某个对象是否是一个可迭代的对象class MyClass(object):# 可迭代对象的本质是,类中是否定义了 __iter__() 方法def __iter__(self):return selfc1 = MyClass() # 对象c1不是可迭代对象 result = isinstance(c1, Iterable) print(result)
- 举例说明迭代器本质原理
比如,数学中有个著名的斐波拉契数列(Fibonacci),数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
现在我们想要通过for...in...循环来遍历迭代斐波那契数列中的前n个数。那么这个斐波那契数列我们就可以用迭代器来实现,每次迭代都通过数学计算来生成下一个数。
class Fibonacci():def __init__(self, num):# 通过构造方法,保存num到类的成员属性中self.num = num# 定义变量保存斐波那契数列前两个值self.a = 0self.b = 1# 记录当前的变量值self.current_index = 0def __iter__(self):# 返回迭代器,因自身就是迭代器,故可以返回自己return selfdef __next__(self):# 判断是否生成完毕if self.current_index < self.num:# 返回result = self.a# 交换两个变量值self.a, self.b = self.b, self.a+self.bself.current_index += 1return resultelse:# 停止迭代raise StopIterationif __name__ == '__main__':# 创建迭代器fib_iterator = Fibonacci(5)# 使用迭代器,输出斐波那契数列值for value in fib_iterator:print(value, end=" ")
转载于:https://www.cnblogs.com/yanguhung/p/10145767.html
Python中生成器generator和迭代器Iterator的使用方法相关推荐
- python生成器generator和迭代器Iterator测试
为什么需要使用生成器? ''' generator生成器 通过列表推导式,我们可以创建一个新的列表,但是,受内存限制,列表的容量是有限的. 而且,创建一个包含100万个元素的列表,不仅占用很大存储空间 ...
- [转载] Python中生成器和迭代器的区别
参考链接: Python迭代器 Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list.string.tuple.dict等这些容器对 ...
- Python中生成器是什么?
何为生成器 生成器的wiki页:https://en.wikipedia.org/wiki/Generator_(computer_programming) 在计算机科学中,生成器是特定的迭代器,它完 ...
- python中生成器的惰性机制
生成器有一个惰性机制,只有当你需要的时候才给你(一个个的取),而不是一下字全部给你.可能有些抽象,来一个例子 吧. 普及一个小知识**:一只母鸡并不是生一辈子鸡蛋,有一个时间段.** 例:小明和小红两 ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是
在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...
- 介绍python中几种遍历列表的for循环方法
我们在使用列表的过程中,经常需要遍历列表的所有元素,对每个元素执行相同的操作.今天就给大家介绍python中几种遍历列表的for循环方法. 首先我们先构造一个numbers列表,如下: numbers ...
- python中用于释放类占用的资源的方法是()_mooc大学英语词汇期末答案
把两个已有项目放到一起,就是一个新项目,这种项目来源属于(?? ) 答:整合 辩证法同形而上学的斗争 答:是从属于唯物主义同唯心主义的斗争,并同这种斗争交织在一起的 中国大学MOOC: 广义的计划是对 ...
- python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...
对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...
最新文章
- 在Ubuntu 16.04.6 LTS升级python 3.5.x到3.7.3之后导致gnome-ternimal无法打开的解决办法
- Handler线程间通信
- 从0搭建一个Springboot+vue前后端分离项目(一)安装工具,创建项目
- 设计模式之策略模式和状态模式
- deeplearning4j
- 前端学习(3079):vue+element今日头条管理-数据筛选处理
- linux php mysql 中文_Linux下PHP+MySQL+CoreSeek中文检索引擎配置 | 系统运维
- Web页面打印及GridView导出到Excel
- springboot 文件上传大小配置
- 设计模式-第八篇之桥接模式
- openlayers集成echarts实现百度迁徙的模拟
- 思科交换机dhcp配置
- 虚幻4皮肤材质_虚幻4果真被玩坏了?浅谈光影与材质带来的极致体验
- styl类型文件css,styl样式文件问题:vue重复加载
- 【数字IC/FPGA】时钟无毛刺切换
- 微型计算机基础答案,第1章 微型计算机基础知识 题库和答案
- 冬奥闭幕,冰雪产业将何去何从
- PAT甲级1100 Mars Numbers (20 分)题解
- HP大中华区总裁孙振耀撰文谈退休并畅谈人生【全详细】
- 机器学习笔记-多分类下的召回率和F值