python生成器与迭代器。

生成器

在python 中一边循环一边计算的机制,叫做生成器(generator)。

通过列表生成式,我们可以直接创建一个列表。但是,收到内存的限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的内存,如果我们只需要前面几个元素,那么后面却大多数的元素占用的内存就白白浪费掉了。所以,如果列表元素可以按照某种算法推算出来,就可以在循环过程中不断推算出后续的元素。就不用创建完整的list,从而节省大量的空间。

生成器保存的是算法,每次调用 next(G) ,就计算出 G 的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的异常。

 

资料参考: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000

      https://www.zhihu.com/question/20829330

创建生成器的方法

①要把一个列表生成式的 [ ] 改成 ( )

类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

a = (x for x in  range(5))
print(a)
next(a)
next(a)
list(a)

②使用yieId

yieId 与 ruturn 一样会返回一个值,但是这两者是有区别的:

   yieId语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执

def gensquares(N):for i in range(N):yield i ** 2a = gensquares(5)
b = gensquares(6)print(next(a))
print(next(b))
print(next(a))
print(next(b))
print(next(a))
print(next(b))print(list(a))
print(list(b))

 

总结

生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。

生成器的特点:

  1. 节约内存
  2. 迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

 

 迭代器

迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

 可迭代对象

以直接作用于 for 循环的数据类型有以下几种:

一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;

一类是 generator ,包括生成器和带 yield 的generator function。

这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。

 

iter()函数

生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。

把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数:

 

 总结

  • 凡是可作用于 for 循环的对象都是 Iterable 类型;
  • 凡是可作用于 next() 函数的对象都是 Iterator 类型
  • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。

迭代器与生成器的区别

参考资料:http://blog.csdn.net/jinixin/article/details/72232604

生成器是一种特殊的迭代器,但迭代器不一定是生成器。

生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要再手动实现两方法。

生成器在迭代的过程中可以改变当前迭代值,而修改普通迭代器的当前迭代值往往会发生异常,影响程序的执行。

 

转载于:https://www.cnblogs.com/ksunone/p/8572088.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos mysql 设置_CentOS下MySQL安装后配置和设置-阿里云开发者社区

CentOS下MySQL安装后配置和设置:1:安装完成路径:1、数据库目录/var/lib/mysql/2、配置文件/usr/share/mysql(mysql.server命令及配置文件)3、启动脚本/etc/rc.d/init.d/(启动脚本文件mysql的目录)4、相关命令/usr/bin(mysqladmin mysqldump等命令)注:1~3…

python怎样将list转化成字典_在python 中如何将 list 转化成 dictionary

原标题:在python 中如何将 list 转化成 dictionary 问题1:如何将一个list转化成一个dictionary? 问题描述:比如在python中我有一个如下的list,其中奇数位置对应字典的key,偶数位置为相应的value解决方案: 1…

vscode gcc debug dbg gdb c cpp c++ cuckoo monitor

为什么80%的码农都做不了架构师?>>> 装cygwin 或者mingGW,装gcc工具链,并将cygwin的bin目录加入环境变量PATH中。 ctrlshiftb {// See https://go.microsoft.com/fwlink/?LinkId733558// for the documentation about the tasks…

hive索引

创建 hive (zmgdb)> create index index_t1 on table v_t1(name) > as > org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler > with > deferred rebuild in table save_index_t1_table; OK Time …

python爬取知网论文关键词_Python爬虫根据关键词爬取知网论文摘要并保存到数据库中...

由于实验室需要一些语料做研究,语料要求是知网上的论文摘要,但是目前最新版的知网爬起来有些麻烦,所以我利用的是知网的另外一个搜索接口 搜索出来的结果和知网上的结果几乎一样 在这个基础上,我简单看了些网页的结构,…

网页中查看pdf文档

2019独角兽企业重金招聘Python工程师标准>>> 介绍&#xff1a; PDFObject 是一个 JavaScript 库&#xff0c;用来在HTML中动态嵌入 PDF 文档。 实现代码&#xff1a; <script type"text/javascript" src"pdfobject.js"></script>…

导入导出数据

导入数据 从文件中装载数据 hive>LOAD DATA [LOCAL] INPATH ... [OVERWRITE] INTO TABLE t2 [PARTITION (provincebeijing)]; LOCAL&#xff1a;linux本地的文件。无LOCAL&#xff1a;是hdfs的文件 注意&#xff1a; 从本地文件系统中将数据导入到Hive表的过程中&#xf…

python opencv 读取视频流不解码_python + opencv: 解决不能读取视频的问题

博主一开始使用python2.7和Opencv2.4.10来获取摄像头图像&#xff0c;程序如下&#xff1a; cap cv2.VideoCapture(0) ret, frame cap.read()使用这个程序能够打开摄像头并获取图像&#xff0c;一切正常。 接着想使用OpenCv播放视频&#xff0c;按照官方教程只要将VideoCaptu…

jmeter提取mysql返回值_jmeter连接数据库和提取数据库返回值

一、在MySQL命令行中&#xff0c;验证MySQL是否能正常登陆。若不能登陆&#xff0c;则重置MySQL的密码。二、下载mysql-connector-java-5.1.45-bin.jar&#xff0c;将其放入Jmeter安装目录的lib目录下。完成MySQL数据库的驱动。三、右键“线程组”->“配置元件”->“JDBC…

[转] Lodash

与underscore 类似 &#xff0c; 是1个js库&#xff0c;内部封装了诸多对字符串、数组、对象等常见数据类型的处理函数。 模块组成 Lodash 提供的辅助函数主要分为以下几类&#xff0c;函数列表和用法实例请查看 Lodash 的官方文档&#xff1a; Array&#xff0c;适用于数组类型…

读模式与写模式

RDBMS是写模式 Hive是读模式 我们传统的关系型数据库RDBMS是写模式。在RDBMS里&#xff0c;我们对表进行数据操作时候&#xff0c;RDBMS会用数据库的第一第二第三范式去检查数据的规范性&#xff0c;如果不符合规范&#xff0c;数据库就拒绝数据的加载和操作。这个验证过程消耗…

用python画雨滴_Python编程从入门到实践练习(雨滴)

雨滴&#xff1a;寻找一幅雨滴图像&#xff0c;并创建一系列整齐排列的雨滴。让这些雨滴往下落&#xff0c;直到到达屏幕后消失。 先说今天的问题&#xff1a; 1.在更改函数形参时&#xff0c;调用的时候也要修改&#xff0c;否则会出现AttributeError 值得注意的是&#xff1a…

python你是否也走进了这个误区了_Python是不是被严重高估了?

是python被曲解了python有非常强的局限性&#xff0c;那就是只适合在io和网络或其他整合组件上耗费大量时间的快速迭代跨平台需求&#xff0c;比如爬虫和下载快速迭代才能显示出python作为脚本语言不用编译的优势&#xff0c;而io和网络的大量时间消耗才能掩盖python本身糟糕透…

Hive文件格式

Hive有四种文件格式&#xff1a;TextFile&#xff0c;SequenceFile&#xff0c;RCFile&#xff0c;ORC TextFile 默认的格式&#xff0c;文本格式。 SequenceFile 简介 见&#xff1a;http://blog.csdn.net/zengmingen/article/details/52242768 操作 hive (zmgdb)>cre…

learnpythonthehardway下载_Python【十一】:阶段小结

今天来将前一段时间学习的Python的知识系统地梳理一遍&#xff0c;接下来开始实际的编程实践了。 一、Python实验环境搭建 使用Python编程&#xff0c;首先要有一个开发环境&#xff0c;如同C/C上又VS2008家族一样&#xff0c;Linux/MacOS上的部署情况这里不再详述&#xff0c;…

python使用ssh 中文_Python3制作简易SSH登录工具

下载W3Cschool手机App&#xff0c;0基础随时随地学编程>>戳此了解导语做这个的起因大概是&#xff1a;电脑里的Xshell不知道为啥突然显示“评估期已过”之类的提示。。。记得之前认证学校邮箱后是可以免费使用的。。。苍天绕过谁。。。想起上次认证学校邮箱过了N个小时才…

hive java导入CVS

原文&#xff1a;http://bbs.chinahadoop.cn/thread-5343-1-1.html ---------------------------------------------------------------------------------- 本文的目的是hive读取cvs文件&#xff0c;忽略字段中‘\,’&#xff0c;最终还是以,来分割文本 cvs格式是以逗号,隔开…

Django 博客教程(三):创建应用和编写数据库模型

创建 django 博客应用 在上一章节中我们创建了 django 博客的工程&#xff0c;并且成功地运行了它。然而这一切都是 django 为我们创建的项目初始内容&#xff0c;django 不可能为我们初始化生成我们需要的博客代码&#xff0c;这些功能性代码都得由我们自己编写。 django 鼓励…

python将16进制字符串转换为整数_Python 16进制与字符串的转换

电脑上装了Python2.7和3.3两个版本&#xff0c;平时运行程序包括在Eclipse里面调试都会使用2.7&#xff0c;但是由于某些原因在cmd命令行中输入python得到的解释器则是3.3, 一直没对此做处理&#xff0c;因为这样可以对两个版本的差异有一个测试&#xff0c;而且虚拟机里面是2.…