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字符串替换示例
Apr 24 Python
Python使用minidom读写xml的方法
Jun 03 Python
python实现ping的方法
Jul 06 Python
使用python实现rsa算法代码
Feb 17 Python
Python3实现并发检验代理池地址的方法
Sep 18 Python
django解决跨域请求的问题
Nov 11 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
PyTorch学习:动态图和静态图的例子
Jan 06 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 26 Python
Python HTMLTestRunner库安装过程解析
May 25 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
python IP地址转整数
Nov 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 static局部静态变量和全局静态变量总结
2014/03/02 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
PHP fopen中文文件名乱码问题解决方案
2020/10/28 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
python pickle 和 shelve模块的用法
2013/09/16 Python
python 性能提升的几种方法
2016/07/15 Python
python中reload(module)的用法示例详解
2017/09/15 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
PageFactory设计模式基于python实现
2020/04/14 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
几款好用的python工具库(小结)
2020/10/20 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
期末考试动员演讲稿
2014/01/10 职场文书
食堂标语大全
2014/06/11 职场文书
辞职信范文大全
2015/03/02 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书