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 返回汉字的汉语拼音
Feb 27 Python
python网页请求urllib2模块简单封装代码
Feb 07 Python
Python入门之三角函数sin()函数实例详解
Nov 08 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
Dec 15 Python
Python实现生成随机日期字符串的方法示例
Dec 25 Python
Python lambda函数基本用法实例分析
Mar 16 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
解决Python pandas plot输出图形中显示中文乱码问题
Dec 12 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
python上selenium的弹框操作实现
Jul 13 Python
python之随机数函数的实现示例
Dec 30 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
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
php集成动态口令认证
2016/07/21 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JS常用函数使用指南
2014/11/23 Javascript
NodeJS制作爬虫全过程
2014/12/22 NodeJs
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
简单的网页广告特效实例
2017/08/19 Javascript
layui点击按钮添加可编辑的一行方法
2018/08/15 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
js实现聊天对话框
2020/02/08 Javascript
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
python黑魔法之参数传递
2016/02/12 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
战略合作意向书范本
2014/04/01 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
写给领导的感谢信
2015/01/22 职场文书
综合管理员岗位职责
2015/02/11 职场文书
争先创优个人总结
2015/03/04 职场文书
Python中requests库的用法详解
2022/06/05 Python