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脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 Python
Python 专题四 文件基础知识
Mar 20 Python
python机器学习之神经网络(三)
Dec 20 Python
python实现网页自动签到功能
Jan 21 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
Numpy之reshape()使用详解
Dec 26 Python
Django choices下拉列表绑定实例
Mar 13 Python
python实现批量修改文件名
Mar 23 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
Sep 21 Python
Python实现疫情地图可视化
Feb 05 Python
人工智能深度学习OpenAI baselines的使用方法
May 20 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处理斐波那契数列非递归方法
2012/02/04 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
PHP解析目录路径的3个函数总结
2014/11/18 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
python+django+sql学生信息管理后台开发
2018/01/11 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
Stuart Weitzman美国官网:美国奢华鞋履品牌
2016/08/18 全球购物
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
员工薪酬福利制度
2014/01/17 职场文书
函授本科自我鉴定
2014/02/04 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
先进工作者个人总结
2015/02/15 职场文书
努力工作保证书
2015/02/28 职场文书
人民调解协议书
2016/03/21 职场文书
python3 删除所有自定义变量的操作
2021/04/08 Python
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android