iterator python(python迭代器和生成器区别是什么)

2024-06-19 03:43:38 18

iterator python(python迭代器和生成器区别是什么)

本文目录

python迭代器和生成器区别是什么

python中迭代器和生成器的区别

1、共同点

生成器是一种特殊的迭代器。

相关推荐:《Python视频教程》

2、不同点

a、语法上:

生成器是通过函数的形式中调用 yield 或()的形式创建的。

迭代器可以通过 iter() 内置函数创建。

b、用法上:

生成器在调用next()函数或for循环中,所有过程被执行,且返回值。

迭代器在调用next()函数或for循环中,所有值被返回,没有其他过程或动作。

如何更好地理解Python迭代器和生成器

Python这门语言中,生成器毫无疑问是最有用的特性之一。与此同时,也是使用的最不广泛的Python特性之一。究其原因,主要是因为,在其他主流语言里面没有生成器的概念。正是由于生成器是一个“新”的东西,所以,它一方面没有引起广大工程师的重视,另一方面,也增加了工程师的学习成本,最终导致大家错过了Python中如此有用的一个特性。我的这篇文章,希望通过简单易懂的方式,深入浅出地介绍Python的生成器,以改变“如此有用的特性却使用极不广泛”的现象。本文的组织如下:在第1章,我们简单地介绍了Python中的迭代器协议;在本文第2章,将会详细介绍生成器的概念和语法;在第3章,将会给出一个有用的例子,说明使用生成器的好处;在本文最后,简单的讨论了使用生成器的注意事项。1. 迭代器协议由于生成器自动实现了迭代器协议,而迭代器协议对很多人来说,也是一个较为抽象的概念。所以,为了更好的理解生成器,我们需要简单的回顾一下迭代器协议的概念。1. 迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代2. 可迭代对象就是:实现了迭代器协议的对象3. 协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。举个例子:在所有语言中,我们都可以使用for循环来遍历数组,Python的list底层实现是一个数组,所以,我们可以使用for循环来遍历list。如下所示:》》》 for n in :... print n但是,对Python稍微熟悉一点的朋友应该知道,Python的for循环不但可以用来遍历list,还可以用来遍历文件对象,如下所示:》》》 with open(‘/etc/passwd’) as f: # 文件对象提供迭代器协议... for line in f: # for循环使用迭代器协议访问文件... print line...为什么在Python中,文件还可以使用for循环进行遍历呢?这是因为,在Python中,文件对象实现了迭代器协议,for循环并不知道它遍历的是一个文件对象,它只管使用迭代器协议访问对象即可。正是由于Python的文件对象实现了迭代器协议,我们才得以使用如此方便的方式访问文件,如下所示:》》》 f = open(’/etc/passwd’)》》》 dir(f)[’__class__’, ’__enter__’, ’__exit__’, ’__iter__’, ’__new__’, ’writelines’, ’...’2. 生成器Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。Python有两种不同的方式提供生成器:2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎***隐藏网址***1. 生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行2. 生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表2.1 生成器函数我们来看一个例子,使用生成器返回自然数的平方(注意返回的是多个值):def gensquares(N): for i in range(N): yield i ** 2for item in gensquares(5): print item,使用普通函数:def gensquares(N): res = for i in range(N): res.append(i*i) return resfor item in gensquares(5): print item,可以看到,使用生成器函数代码量更少。2.2 生成器表达式使用列表推导,将会一次产生所有结果:》》》 squares = 》》》 squares将列表推导的中括号,替换成圆括号,就是一个生成器表达式:》》》 squares = (x**2 for x in range(5))》》》 squares》》》 next(squares)0》》》 next(squares)1》》》 next(squares)4》》》 list(squares)Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎***隐藏网址***议,所以,我们可以直接这样计算一系列值的和:》》》 sum(x ** 2 for x in xrange(4))而不用多此一举的先构造一个列表:》》》 sum()2.3 再看生成器前面已经对生成器有了感性的认识,我们以生成器函数为例,再来深入探讨一下Python的生成器:1. 语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值2. 自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常3. 状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行3. 示例我们再来看两个生成器的例子,以便大家更好的理解生成器的作用。首先,生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。大家可以在自己电脑上试试下面两个表达式,并且观察内存占用情况。对于前一个表达式,我在自己的电脑上进行测试,还没有看到最终结果电脑就已经卡死,对于后一个表达式,几乎没有什么内存占用。sum()sum(i for i in xrange(10000000000))除了延迟计算,生成器还能有效提高代码可读性。例如,现在有一个需求,求一段文字中,每个单词出现的位置。不使用生成器的情况:def index_words(text): result = if text: result.append(0) for index, letter in enumerate(text, 1): if letter == ’ ’: result.append(index) return result使用生成器的情况:2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎***隐藏网址***def index_words(text): if text: yield 0 for index, letter in enumerate(text, 1): if letter == ’ ’: yield index这里,至少有两个充分的理由说明 ,使用生成器比不使用生成器代码更加清晰:1. 使用生成器以后,代码行数更少。大家要记住,如果想把代码写的Pythonic,在保证代码可读性的前提下,代码行数越少越好2. 不使用生成器的时候,对于每次结果,我们首先看到的是result.append(index),其次,才是index。也就是说,我们每次看到的是一个列表的append操作,只是append的是我们想要的结果。使用生成器的时候,直接yield index,少了列表append操作的干扰,我们一眼就能够看出,代码是要返回index。这个例子充分说明了,合理使用生成器,能够有效提高代码可读性。只要大家完全接受了生成器的概念,理解了yield语句和return语句一样,也是返回一个值。那么,就能够理解为什么使用生成器比不使用生成器要好,能够理解使用生成器真的可以让代码变得清晰易懂。4. 使用生成器的注意事项相信通过这篇文章,大家已经能够理解生成器的作用和好处。但是,还没有结束,使用生成器,也有一点注意事项。我们直接来看例子,假设文件中保存了每个省份的人口总数,现在,需要求每个省份的人口占全国总人口的比例。显然,我们需要先求出全国的总人口,然后在遍历每个省份的人口,用每个省的人口数除以总人口数,就得到了每个省份的人口占全国人口的比例。如下所示:def get_province_population(filename): with open(filename) as f: for line in f: yield int(line)gen = get_province_population(’data.txt’)all_population = sum(gen)#print all_populationfor population in gen: print population / all_population执行上面这段代码,将不会有任何输出,这是因为,生成器只能遍历一次。在我们执行sum语句的时候,就遍历了我们的生成器,当我们再次遍历我们的生成器的时候,将不会有任何记录。所以,上面的代码不会有任何输出。因此,生成器的唯一注意事项就是:生成器只能遍历一次。5. 总结2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎***隐藏网址***本文深入浅出地介绍了Python中,一个容易被大家忽略的重要特性,即Python的生成器。为了讲解生成器,本文先介绍了迭代器协议,然后介绍了生成器函数和生成器表达式,并通过示例演示了生成器的优点和注意事项。在实际工作中,充分利用Python生成器,不但能够减少内存使用,还能够提高代码可读性。掌握生成器也是Python高手的标配。希望本文能够帮助大家理解Python的生成器

Python什么是迭代器

iamlaosong文我们在用for...in...语句循环时,in后面跟随的对象要求是可迭代对象,即可以直接作用于for循环的对象统称为可迭代对象(iterable),如list、tuple、dict、set、str等。可迭代对象是实现了__iter__()方法的对象,而迭代器(iterator)则是实现了__iter__()和__next__()方法的对象,可以显示地获取下一个元素。这种可以被next调用并不断返回下一个值的对象称为迭代器。迭代器一定是可迭代对象,反过来则不一定成立。用iter()函数可以把list、dict、str等iterable变成iterator,例如:bb=cc=iter(bb)cc.next()循环变量的值其实可以看着是一次次用next取值的过程,每取一个值,做一次处理。list等对象用于循环实际上可以看着是用iter()方法产生一个迭代器,然后循环取值。生成器(generator)就是一个能返回迭代器的函数,其实就是定义一个迭代算法,可以理解为一个特殊的迭代器。调用这个函数就得到一个迭代器,生成器中的yield相当于一个断点,执行到此返回一个值后暂停,从而实现next取值。

python迭代器和生成器的区别

迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退。

迭代器有两个基本的方法:iter()和next()。

生成器

在Python中,使用了yield的函数被称为生成器。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

迭代器与生成器之间的区别:

迭代器是一个更抽象的概念,任何对象,如果它的类有NEXTiter方法返回自己本身,对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台For语言对容器对象条用iter()函数,iter()是Python的内置函数。iter()会返回一个定义了next()方法迭代器对象,在容器中逐个访问容器的元素,next()也是Python的内置函数,next()会抛出StopIteration异常。

生成器是创新迭代器的简单而强大的工具,它们写起来就好像正则函数,只是在需要返回数据的时候使用yield 语句。

迭代器协议,对象需要提供next()方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,终止迭代。

可迭代对象,实现了迭代器协议对象。list、tuple、dict都是Iterable可迭代的对象,但不是Iterator迭代器对象。

python生成器和迭代器的区别

迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅“记住”了它的数据状态,生成器还记住了程序执行的位置。(2)迭代器迭代器是一种支持next()操作的对象。它包含了一组元素,当执行next()操作时,返回其中一个元素。当所有元素都被返回后,再执行next()报异常—StopIteration生成器一定是可迭代的,也一定是迭代器对象(3)区别:①生成器是生成元素的,迭代器是访问集合元素的一中方式②迭代输出生成器的内容③迭代器是一种支持next()操作的对象④迭代器(iterator):其中iterator对象表示的是一个数据流,可以把它看做一个有序序列,但我们不能提前知道序列的长度,只有通过nex()函数实现需要计算的下一个数据。可以看做生成器的一个子集。

iterator python(python迭代器和生成器区别是什么)

本文编辑:admin

更多文章:


extraction的用法(浊点萃取法的原理,仪器及应用越详细越好,不要粘贴的)

extraction的用法(浊点萃取法的原理,仪器及应用越详细越好,不要粘贴的)

本文目录浊点萃取法的原理,仪器及应用越详细越好,不要粘贴的关于“血统”的几个单词desent stock lineage extraction origin和ancestry的用法浊点萃取法的原理,仪器及应用越详细越好,不要粘贴的浊点萃取法

2024年7月13日 16:21

ubuntu安装eclipse详细教程(ubuntu14怎么安装eclipse)

ubuntu安装eclipse详细教程(ubuntu14怎么安装eclipse)

大家好,如果您还对ubuntu安装eclipse详细教程不太了解,没有关系,今天就由本站为大家分享ubuntu安装eclipse详细教程的知识,包括ubuntu14怎么安装eclipse的问题都会给大家分析到,还望可以解决大家的问题,下面我

2024年9月3日 18:40

异步传输的工作原理(什么是同步传输什么是异步传输)

异步传输的工作原理(什么是同步传输什么是异步传输)

本文目录什么是同步传输什么是异步传输简述异步传输模式的特点请解释同步传输和异步传输的概念,并指明两者的区别简述三相交流异步电动机的工作原理并说明“异步”的原因异步串行通信的基本原理异步时分复用的工作原理简述三相异步电动机的工作原理,并解释“

2024年7月12日 16:57

preferencescreen(preference onbindviewholder 什么时候调用)

preferencescreen(preference onbindviewholder 什么时候调用)

本文目录preference onbindviewholder 什么时候调用android 怎么用preference内的layoutpreferencescreen可以添加button吗preference onbindviewholde

2024年7月22日 05:49

网页源代码怎么看密码(源代码中如何找到密码)

网页源代码怎么看密码(源代码中如何找到密码)

本文目录源代码中如何找到密码怎样查看浏览器保存的密码如何根据源代码查看网页访问密码如何获得网站源码的后台登陆密码怎么查看网页保存的密码一个ASP的网站,源代码用FTP下载回来了,怎么看到后台管理密码怎么在网页源代码里查看QQ空间密码怎么样才

2024年7月22日 04:27

unix打开命令窗口(如何在windows系统中使用linux的命令)

unix打开命令窗口(如何在windows系统中使用linux的命令)

本文目录如何在windows系统中使用linux的命令我装了个red hat lunix (fedora),怎么切换到命令行格式在unix窗口(tera term)里粘贴指令后跳出来一个类似剪贴板的一个对话框在UNIX命令行界面中,如何访问

2024年7月22日 21:25

jenkins k8s 自动部署(k8s的咖啡伴侣 -- 自动化部署工具Drone)

jenkins k8s 自动部署(k8s的咖啡伴侣 -- 自动化部署工具Drone)

本文目录k8s的咖啡伴侣 -- 自动化部署工具DroneJenkins-配置K8S负载k8s部署Eureka和Seata_2020.05.28k8s的咖啡伴侣 -- 自动化部署工具Drone刚开始打算用Jenkins+shell 部署镜像到

2024年6月23日 07:53

chorus在音乐中的意思(chorus在音乐中的意思是什么)

chorus在音乐中的意思(chorus在音乐中的意思是什么)

本文目录chorus在音乐中的意思是什么pre-chorus和chorus有什么区别歌词中的verse chorus bridge分别是什么意思英文歌曲中的 the intro, the verse ,the chorus 是什么意思“pr

2023年7月31日 08:40

安卓市场网址(安卓市场的官方下载地址是什么麻烦知道的说一下)

安卓市场网址(安卓市场的官方下载地址是什么麻烦知道的说一下)

本文目录安卓市场的官方下载地址是什么麻烦知道的说一下电脑能不能进安卓市场下东西可以的话给个网址,谢谢安卓市场的官方下载地址是什么麻烦知道的说一下《p》楼主好!国内无安卓市场官方!《/p》 《p》权威的是: 《a href=“http://

2024年5月29日 09:38

multisim蜂鸣器怎么响(如何在multisim10中使用蜂鸣器)

multisim蜂鸣器怎么响(如何在multisim10中使用蜂鸣器)

大家好,multisim蜂鸣器怎么响相信很多的网友都不是很明白,包括如何在multisim10中使用蜂鸣器也是一样,不过没有关系,接下来就来为大家分享关于multisim蜂鸣器怎么响和如何在multisim10中使用蜂鸣器的一些知识点,大家

2024年9月1日 11:05

python高级(中高级python工程师是什么职位)

python高级(中高级python工程师是什么职位)

本文目录中高级python工程师是什么职位python是面向什么的高级语言python是一种什么的高级编程语言假期自学Python顺序Python高级编程的作者简介提升Python运行速度的5个小技巧python调试程序BUG的心得技巧分享

2024年7月13日 07:01

导数公式大全 高数(大学高数16个导数公式)

导数公式大全 高数(大学高数16个导数公式)

大家好,今天小编来为大家解答以下的问题,关于导数公式大全 高数,大学高数16个导数公式这个很多人还不知道,现在让我们一起来看看吧!本文目录大学高数16个导数公式用最简单易懂的话讲一下高等数学中怎么求导数高等数学公式都有哪些高数求导公式有哪些

2024年9月5日 18:50

spring security的概述(Spring Security解析三:SecurityFilterChain创建过程)

spring security的概述(Spring Security解析三:SecurityFilterChain创建过程)

“spring security的概述”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看spring security的概述(Spring Security解析三:SecurityFilterChain创建过程)!本文目录Sp

2024年7月14日 08:35

ecshop版权信息设置(修改ECSHOP头部版权报错)

ecshop版权信息设置(修改ECSHOP头部版权报错)

本文目录修改ECSHOP头部版权报错ecshop3.0版权如何去掉ECSHOP页脚灰色字体版权信息怎么修改如何去除ecshop标题和网站底部的Powered by ECShop修改ECSHOP头部版权报错版权信息是在一个JS文件里的。。您是

2024年7月14日 06:07

人类一败涂地登录界面图片(Steam上人类一败涂地启动显示缺失文件)

人类一败涂地登录界面图片(Steam上人类一败涂地启动显示缺失文件)

本文目录Steam上人类一败涂地启动显示缺失文件人类一败涂地按键操作方法humanfallflat键位怎么操作电脑怎么下载人类一败涂地人类一败涂地怎么和好友联机如何评价游戏 Human Fall Flat(人类:一败涂地)人类一败涂地ste

2024年7月18日 03:37

transition vue(如何理解vue过渡效果的各个阶段)

transition vue(如何理解vue过渡效果的各个阶段)

本文目录如何理解vue过渡效果的各个阶段vue的 过渡动画 可以不通过 show if 触发吗怎么做Vue 如何在 transition-group 内控制div的动画如何使用 vue transition 实现 ios 按钮一样的平滑切换

2024年6月30日 17:44

filezilla server下载(filezilla server重启之后,客户端怎么继续下载)

filezilla server下载(filezilla server重启之后,客户端怎么继续下载)

本文目录filezilla server重启之后,客户端怎么继续下载filezilla服务器怎么安装filezilla server 怎么设置filezilla server怎么安装filezilla server 怎么用怎么用FileZi

2024年7月2日 23:02

设计师常用软件(设计师必须掌握的软件都有哪些)

设计师常用软件(设计师必须掌握的软件都有哪些)

大家好,今天小编来为大家解答以下的问题,关于设计师常用软件,设计师必须掌握的软件都有哪些这个很多人还不知道,现在让我们一起来看看吧!本文目录设计师必须掌握的软件都有哪些设计常用的软件(设计师常用软件)平面设计师需要掌握什么软件学设计需要掌握

2024年8月10日 05:35

bower 为什么要安装git?bower 和 npm 的区别

bower 为什么要安装git?bower 和 npm 的区别

本文目录bower 为什么要安装gitbower 和 npm 的区别bower 为什么要安装git1首先你得有node,这里就不多做介绍了另外,对于windows用户,还需要装msysgit,如下图。注意图二中的那个选项2全局安装bower

2024年7月11日 11:42

intel是什么意思(intel平台 是什么意思)

intel是什么意思(intel平台 是什么意思)

本文目录intel平台 是什么意思intel处理器的后缀字母什么意思intel平台 是什么意思买I7-3770,看自己的需求,可以考虑最高Z77,最低B75,X79是LGA2011的插槽,至于剩下的68.67等等,都是上一代的芯片组了。个人

2024年7月4日 06:57

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1730
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1155
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1152
标签列表

热门搜索