Python迭代器
迭代器是可以重复的对象。 在本教程中,您将学习迭代器的工作方式以及如何使用__iter__和__next__方法构建自己的迭代器。
Python的迭代器是什么?
迭代器在Python无处不在。 它们通过for循环、理解、生成器等优雅地实现,但隐藏在眼皮底下。
Python迭代器是一个可重复的对象。 一次返回一个元素的返回数据的对象。
从技术上讲,Python迭代器对象必须通过组合__iter__ ()和__next__ ()实现两种特殊的方法,称为迭代器协议。
如果迭代器可从对象中获得,则对象称为可重复。 许多内置在Python中的容器是可重复的,例如list、tuple和string。
iter (函数(即__iter__ ) )方法)会从它们返回迭代器。
使用Python迭代器进行迭代
此next ) )函数手动遍历迭代器中的所有项目。 当我们最后到达,没有更多的返回数据时,它会引起StopIteration。 以下是一个例子。
示例#定义列表
my _ list=[ 4,7,0,3 ]
使用iter ()获取迭代器
my_Iter=Iter(my_list ) ) ) ) ) ) ) ) ) ) ) my_Iter=Iter(my_list ) ) ) ) ) ) ) ) my ) ) my ) ) 65 )
使用iter ()获取迭代器
#输出4
print(next ) my_Iter ) )
#输出7
print(next ) my_Iter ) )
#next(obj )与obj.__next__ )相同
#输出0
print(my_Iter.__next__ () )
#输出3
print(my_Iter.__next__ () )
#这导致了错误,没有项目剩下
next(my_Iter )
自动迭代的一个更优雅的方法是使用for循环。 通过这种方法,可以迭代地返回迭代器中的任何对象,如列表、字符串或文件。 forelementinmy_list:
. (元素) )。
.
4
7
0
3
for循环实际上是如何工作的?
如上面的示例所示,for循环可以自动遍历列表。
实际上,for循环可以重复任何可重复的对象。 让我们仔细看看for在Python中实际实现循环的方式。 forelementiniterable:
对#元素做点什么
实际上已经实现了。 创建迭代器的iterable
iter_obj=ITER(iterable ) )。
#无限循环
whileTrue:
try:
#获取以下内容
element=next(ITER_obj )
对#元素做点什么
exceptStopIteration:
诱发StopIteration时,从循环开始中断
布莱克
因此,在内部,for循环通过在iterable中调用iter ()来创建迭代器的iter_obj。
讽刺的是,这个for循环实际上是无限的while循环。
在循环中,next ) )调用以获取下一个元素,并使用此值执行for循环的主体。 使用所有项目后,会抛出StopIteration,并在内部捕获,然后循环结束。 请注意,所有其他类型的异常都将通过。
用Python构建自己的迭代器
在Python中从头开始构建迭代器很简单。 您只需实现这些方法__iter__ ()和__next__ ()。
__iter__ ()方法返回迭代器对象本身。 如果需要,可以执行一些初始化。
__next__ ()方法必须返回序列中的下一项。 到达终点时,以及之后的调用中,必须触发StopIteration。
以下示例为每次迭代提供2的幂。 乘方指数从0到用户设定的数字。
示例classPowTwo:
实现“”迭代器的类
的乘方
def__init__(self,max=0) :
self.max=max
def__iter__(self ) :
self.n=0
返回自
def__next__(self ) :
ifself.n=self.max:
result=2**self.n
self.n=1
返回结果
else:
raiseStopIteration
>现在,我们可以创建一个迭代器,并如下进行迭代。>>> a = PowTwo(4)
>>> i = iter(a)
>>> next(i)
1
>>> next(i)
2
>>> next(i)
4
>>> next(i)
8
>>> next(i)
16
>>> next(i)
Traceback (most recent call last):
...
StopIteration
我们还可以使用for循环来迭代迭代器类。>>> for i in PowTwo(5):
... print(i)
...
1
2
4
8
16
32
Python无限迭代器
迭代器对象中的项不必耗尽。可能有无限的迭代器(永远不会结束)。在处理这样的迭代器时,我们必须小心。
这是一个演示无限迭代器的简单示例。
内置函数 iter()可以用两个参数调用,其中第一个参数必须是可调用对象(函数),第二个参数是标记。迭代器调用这个函数,直到返回的值等于标记值为止。>>> int()
0
>>> inf = iter(int,1)
>>> next(inf)
0
>>> next(inf)
0
我们可以看到int()函数始终返回0。因此,将其作为iter(int,1)传递将返回一个迭代器,该迭代器调用int()直到返回值等于1。这永远不会发生,并且我们得到一个无限迭代器。
我们还可以构建自己的无限迭代器。理论上,以下迭代器将返回所有奇数。
示例class InfIter:
"""无限迭代器返回所有
奇数"""
def __iter__(self):
self.num = 1
return self
def __next__(self):
num = self.num
self.num += 2
return num
运行如下。>>> a = iter(InfIter())
>>> next(a)
1
>>> next(a)
3
>>> next(a)
5
>>> next(a)
7
等等...
在这些类型的无限迭代器上进行迭代时,请小心包含终止条件。
使用迭代器的优点是节省了资源。如上所示,我们无需将整个数字系统存储在内存中就可以获得所有奇数。从理论上讲,我们可以在有限内存中包含无限项。
迭代器还使我们的代码看起来很酷。
有一种在Python中创建迭代器的简便方法。要了解更多信息,请访问:Python生成器yield。