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字符串的encode与decode研究心得乱码问题解决方法
Mar 23 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
python实现飞机大战
Sep 11 Python
python实现自动解数独小程序
Jan 21 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
Django获取应用下的所有models的例子
Aug 30 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
python unichr函数知识点总结
Dec 16 Python
用python基于appium模块开发一个自动收取能量的小助手
Sep 25 Python
python库Tsmoothie模块数据平滑化异常点抓取
Jun 10 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
Protoss魔法科技
2020/03/14 星际争霸
PHP读写文件的方法(生成HTML)
2006/11/27 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
2015/03/14 Javascript
Javascript之String对象详解
2016/06/08 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
JavaScript闭包和回调详解
2017/08/09 Javascript
js中this对象用法分析
2018/01/05 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
python的类方法和静态方法
2014/12/13 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
python 如何区分return和yield
2020/09/22 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
应届毕业生如何写求职信
2014/02/16 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
vue的项目如何打包上线
2022/04/13 Vue.js
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python