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 24 Python
python实现html转ubb代码(html2ubb)
Jul 03 Python
python决策树之CART分类回归树详解
Dec 20 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
Jan 07 Python
Python 词典(Dict) 加载与保存示例
Dec 06 Python
Python面向对象之多态原理与用法案例分析
Dec 30 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
如何对python的字典进行排序
Jun 19 Python
Spy++的使用方法及下载教程
Jan 29 Python
python 实现有道翻译功能
Feb 26 Python
68行Python代码实现带难度升级的贪吃蛇
Jan 18 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
apache rewrite_module模块使用教程
2008/01/10 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
2018/07/23 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
Python机器学习之决策树算法
2017/12/22 Python
Python面向对象之继承代码详解
2018/01/29 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
Eyeko美国:屡获殊荣的睫毛膏、眼线笔和眉妆
2018/07/05 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
北京大学自荐信范文
2014/01/28 职场文书
利群广告词
2014/03/20 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python