问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python的迭代器为什么一定要实现

发布网友 发布时间:2022-04-07 13:10

我来回答

2个回答

热心网友 时间:2022-04-07 14:39

这是个和多态有关的问题,Python中关于迭代有两个概念,第一个是Iterable,第二个是Iterator,协议规定Iterable的__iter__方法会返回一个Iterator, Iterator的__next__方法(Python 2里是next)会返回下一个迭代对象,如果迭代结束则抛出StopIteration异常。
同时,Iterator自己也是一种Iterable,所以也需要实现Iterable的接口,也就是__iter__,这样在for当中两者都可以使用。Iterator的__iter__只需要返回自己就行了。这样,下面的代码就可以工作:

for i in my_list:
...

for i in iter(mylist):
...

for i in (v for v in mylist if v is not None):
...

Python中许多方法直接返回iterator,比如itertools里面的izip等方法,如果Iterator自己不是Iterable的话,就很不方便,需要先返回一个Iterable对象,再让Iterable返回Iterator。生成器表达式也是一个iterator,显然对于生成器表达式直接使用for是非常重要的。
那么为什么不只保留Iterator的接口而还需要设计Iterable呢?许多对象比如list、dict,是可以重复遍历的,甚至可以同时并发地进行遍历,通过__iter__每次返回一个独立的迭代器,就可以保证不同的迭代过程不会互相影响。而生成器表达式之类的结果往往是一次性的,不可以重复遍历,所以直接返回一个Iterator就好。让Iterator也实现Iterable的兼容就可以很灵活地选择返回哪一种。

总结来说Iterator实现的__iter__是为了兼容Iterable的接口,从而让Iterator成为Iterable的一种实现。

补充一下题主对于for的理解基本上是正确的,但仍然有一点点偏差:for为了兼容性其实有两种机制,如果对象有__iter__会使用迭代器,但是如果对象没有__iter__,但是实现了__getitem__,会改用下标迭代的方式。我们可以试一下:

>>> class NotIterable(object):
... def __init__(self, baselist):
... self._baselist = baselist
... def __getitem__(self, index):
... return self._baselist[index]
...
>>> t = NotIterable([1,2,3])
>>> for i in t:
... print i
...
1
2
3
>>> iter(t)
<iterator object at 0x0345E3D0>

当for发现没有__iter__但是有__getitem__的时候,会从0开始依次读取相应的下标,直到发生IndexError为止,这是一种旧的迭代协议。iter方法也会处理这种情况,在不存在__iter__的时候,返回一个下标迭代的iterator对象来代替。一个重要的例子是str,字符串就是没有__iter__接口的。

热心网友 时间:2022-04-07 15:57

迭代器类似一个只能向外弹出数据的栈,但它的深度只有1,也即它占的内存也只是一个数据的内存,比如说,我们有1到10000的一个列表,通常情况下,内存中会存放10000个数,如果用迭代器,它只会存放一个数,然后根据这个数和特定的算法,通过next方法获取下一个数,最大的好像是大大节约了内存,但如果需要的数据是最后一个数据时,会比直接从内存中得到慢,即时间换空间
Python深入理解迭代器和生成器

1. 迭代器迭代器是Python中的一个重要概念,用于遍历集合,具备记住位置并提供下一个元素访问的能力。其工作原理遵循迭代器协议,当遍历完集合后,调用next()会引发StopIteration异常。2. 使用迭代器通过for循环或while循环结合next()函数,可以实现对迭代器的遍历。例如,可以遍历列表并处理StopIteration异常。

什么是迭代器,Python迭代器及其用法

迭代器本身是一个底层的特性和概念,在程序中并不常用。然而,它为生成器这一更有趣的特性提供了基础。有关生成器的相关知识将在后续章节中介绍。

Python中可迭代对象、迭代器以及iter()函数的两个用法详解

Python内置的Iterable类和collections.abc模块中的方法可以用来检测一个对象是否为可迭代对象,这依赖于对象是否实现了__iter__()方法。如果一个对象没有__iter__()方法,但有__getitem__(),解释器会创造一个迭代器并按序获取元素。若两者皆无,会抛出TypeError。我们可以通过自定义对象并实现这两个方...

Python中可迭代对象、迭代器以及iter()函数的两个用法详解

在Python中,理解可迭代对象、迭代器以及iter()函数的运用至关重要。首先,可迭代对象包括列表、元组、字符串、字典等,它们通过内置的__iter__()方法支持for循环遍历。检测一个对象是否可迭代,可以查阅collections.abc模块中的Iterable类。可迭代对象的关键在于它们实现了__iter__或__getitem__方法。自...

Python中的“迭代”详解

为了“支持多种遍历”,必须能从同一个可迭代的实例中获取多个独立的迭代器,而且各个迭代器要能维护自身的内部状态,因此这一模式正确的实现方式是,每次调用 iter(my_iterable) 都新建一个独立的迭代器。所以总结下来就是:实现相同功能,但却符合 Python 习惯的方式是,用生成器函数代替 SentenceIteror...

Python 开发中有哪些高级技巧

1. 善用迭代器 迭代器在很多语言里面都有,而在 Python 里适当的场景用迭代器会非常的“爽”。一来因为迭代器每次产生一个对象,适当使用能有效节省内存;二来它能达到部分“延迟计算”的效果。除此以外,因为 Generator (yield 关键字)和 Generator Expression 的存在,有时候使用迭代器能提升代码...

如何更好地理解python迭代器和生成器,主要区别是什么

python的迭代器的这一特性可以很方便地用来开发可以通关的小 游戏 ,比起for循环来实在是方便许多,比如下面的 游戏 实例:python迭代器,iter()函数,通关 游戏 实例 - 大器编程 python的生成器generator可以理解成为特殊的迭代器,具备迭代器的上述功能,与迭代器不同的是,生成器往往更多地运用于Python...

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

更好的理解生成器,我们需要简单的回顾一下迭代器协议的概念。1. 迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代2. 可迭代对象就是:实现了迭代器协议的对象3. 协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等...

python迭代器和生成器的区别

迭代器是访问集合元素的一中方式 ②迭代输出生成器的内容 ③迭代器是一种支持next()操作的对象 ④迭代器(iterator):其中iterator对象表示的是一个数据流,可以把它看做一个有序序列,但我们不能提前知道序列的长度,只有通过nex()函数实现需要计算的下一个数据。可以看做生成器的一个子集。

Python迭代器item()、next()、__iter__()、__next__()详解

Python中的迭代器item()、next()、__iter__()和__next__()是编程中的关键概念,它们虽然看似复杂,但理解它们的用法对于处理自定义数据结构至关重要。首先,__iter__()和__next__()是Python的特殊方法,也称为魔术方法。每个类在创建时都会自动拥有这些方法。__iter__()的主要作用是当我们在...

python中迭代器的基本方法 迭代器 python python迭代器原理 迭代器怎么实现自增 迭代器实现的几种方式 python代码生成器 如何实现迭代器 实现迭代器 迭代器实现原理
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
亲们 谁帮我写一个拒绝的短信呀 是相亲认识的 希望有才的帮我写下哦... 出自《聊斋志异》 狼三则的成语有哪些 ...就是现在国内的粉丝比较崇拜哪些韩国偶像,谢谢各位! 请问韩星金贤重主演的电视剧和电影都分别有哪些?除了《花样男子》!谢谢... 鉴别变色眼镜质量的好坏有什么方法呢如何鉴别变色眼镜质量的好坏_百 ... 怎么知道什么颜色的眼镜适合自己 怎样选购变色眼镜 选购变色眼镜有什么方法 马斯克称赞中国电动汽车称其处于世界领先地位 新手怎样挑选变色镜片? 鉴别变色眼镜质量的好坏有什么方法呢如何鉴别变色眼镜质量的好坏 我上环后就是腰疼,还有宫颈里面有个线,外阴瘙痒,,这是不是环移位了 给小孩办银行卡可以代办吗? 充值银币网页打不开,还有什么办法能快速赢得银币求回复 未满十六岁,带监护人身份证去激活工商银行卡,但监护人不去,由叔叔代去可以吗? 我上环半年多了,经常洗澡的时候,发现*里有一条短短的线 ,我也不敢拉,请问是环上面的线吗?急 币赢国际站靠谱吗,是否可以在该平台玩币? 带环后阴道内没有线头,是不是环进去了,能不能去出来啊? 币赢CoinW交易所靠不靠谱? 直线节育环上了半个月工资今天感觉有跟线掉到子宫口了,但彩超说环正常,这是什么原因 未满16岁想办张银行卡 父母不在身边叫叔叔一起去行不行? 币赢网这个网站怎样啊? 女人上环都有尾丝吗? 币赢网跑路币蠃网是在升级吗?为什么这么长时间。 上环有5个月了,昨天月经走后,能摸到子宫口有线!是不是环掉了?还是怎么回事?这正常吗? 今年15岁,因为某些原因,我需要办理南粤的银行卡。但是父母不在身边,我的叔叔可以陪我去吗?希望专业 币赢登录验证失败 我摸我女朋友下面,好像有跟线是上环的吗? 办理中国建设银行卡,有亲属叔叔陪同学生本人是否可以办理? 小米手机加不了币赢是什么原因 我未满16周岁我叔叔可以带我去办银行卡吗 未成年人能办银行卡吗? 币赢CoinWapp可靠吗? 有人被赢币网骗过吗?赢币网是传销吗? 银行卡被法院冻结需要多久才能解冻 动漫中经常说到的“混蛋”用日语怎么写? 混蛋用日语怎么写 日文中“混蛋”有几种说法? 日语混蛋如何写 哪里可以报名计算机学校? 怎么打领带 一步一步 领带怎么打?请教打领带又快又好看的技巧... Word转PDF报Acrobat无法打开,因为不支持此文件类型或者文件已损坏? Word文档用PDF转化器后,文件打不开了? 地效翼飞行器是干什么用的?? 什么叫地效翼飞行器? 地效翼飞行器的优劣 ue4卡在93 俄罗斯现在还研制地效翼飞行器么? 什么是地效飞行器 地效飞机的原理是什么