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__()的主要作用是当我们在...