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 subprocess模块学习总结
Mar 13 Python
Python微信库:itchat的用法详解
Aug 14 Python
python散点图实例之随机漫步
Aug 27 Python
面向初学者的Python编辑器Mu
Oct 08 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
Jul 15 Python
ubuntu上安装python的实例方法
Sep 30 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
python matplotlib 绘图 和 dpi对应关系详解
Mar 14 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
在django中form的label和verbose name的区别说明
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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
PHP面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
《javascript少儿编程》location术语总结
2018/05/27 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
python实现猜单词小游戏
2020/05/22 Python
Python 中的lambda函数介绍
2018/10/10 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
keras:model.compile损失函数的用法
2020/07/01 Python
日本最大的彩色隐形眼镜销售网站:CharmColor
2020/09/09 全球购物
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
资产经营总监岗位职责范文
2013/12/01 职场文书
儿童生日会策划方案
2014/05/15 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
2015教师节通讯稿
2015/07/20 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书