python 生成器和迭代器的原理解析


Posted in Python onOctober 12, 2019

一、生成器简介

在python中,生成器是根据某种算法边循环边计算的一种机制。主要就是用于操作大量数据的时候,一般我们会将操作的数据读入内存中处理,可以计算机的内存是比较宝贵的资源,我认为的当要处理的数据超过内存四分之一的大小时就应该使用生成器。

二、生成器有什么特点?

1.和传统的容器相比,生成器更节省内存。

2.延迟计算,在我们需要结果时就调用一下生成器的next()方法即可。

3.可迭代,你可以像遍历list一样,遍历生成器

三、如何创建生成器?

在python中有两种方式创建生成器:生成器表达式 和 生成器函数。

生成器表达式

gen1 = (x for x in range(10))

生成器函数

生成式函数和普通函数只有一个区别,普通函数使用return返回结果,而生成器函数使用yield返回结果。
yield的特点在于,它并不是结束函数,而是在返回结果后将函数处于一种挂起状态,等待再次next函数的调用,然后从上次挂起的地方(yield)继续执行。

def gen():
a = 1
yield a
b = 2
yield b
c = 3
yield c

g = gen()

print(next(g))
print(next(g))
print(next(g))
print(next(g))

四、迭代器简介

迭代器是一个包含有限数量值的对象。

迭代器是一个可以被迭代的对象,可以遍历迭代器中的所有值。

从技术上讲,在Python中,迭代器是实现迭代器协议的对象,该协议由方法__iter__()和__next__()组成。

可迭代的数据类型

列表、元组、字典和集合都是可迭代的对象,可以从其中获得迭代器。

所有这些对象都可用iter()方法获取迭代器:

示例

从元组中获取一个迭代器,遍历并打印每个值:

mytuple = ("飞机", "汽车", "高铁")
myit = iter(mytuple)

print(next(myit))
print(next(myit))
print(next(myit))

五、创建迭代器

一个对象要创建迭代器,变成可迭代的,必须实现方法:__iter__()和__next__()。

__iter__()方法必须始终返回迭代器对象本身。

__next__()方法必须返回序列中的下一项。

示例

创建一个返回数字的迭代器,从1开始,每个序列项递增1(返回1、2、3、4、5等):

class MyNumbers:
def __iter__(self):
self.a = 1
return self

def __next__(self):
x = self.a
self.a += 1
return x

myclass = MyNumbers()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python如何通过protobuf实现rpc
Mar 06 Python
深入浅析python继承问题
May 29 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
Django异步任务之Celery的基本使用
Mar 23 Python
Python中format()格式输出全解
Apr 12 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
Dec 12 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
python编写扎金花小程序的实例代码
Feb 23 Python
python 表格打印代码实例解析
Oct 12 #Python
Django+uni-app实现数据通信中的请求跨域的示例代码
Oct 12 #Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 #Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 #Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 #Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 #Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
Oct 11 #Python
You might like
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
php中的动态调用实例分析
2015/01/07 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
详解php协程知识点
2018/09/21 PHP
PHP与SQL语句写一句话木马总结
2019/10/11 PHP
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
jQuery+HTML5加入购物车代码分享
2020/10/29 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
Python实现多行注释的另类方法
2014/08/22 Python
详解django自定义中间件处理
2018/11/21 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
python爬虫实现中英翻译词典
2019/06/25 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
技校教师求职简历的自我评价
2013/10/20 职场文书
校园创业策划书
2014/01/14 职场文书
入党自我评价范文
2014/02/02 职场文书
《日月潭》教学反思
2014/02/28 职场文书
公司内部升职自荐信
2015/03/27 职场文书
小学运动会报道稿
2015/07/22 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang