迭代器是能够迭代的对象。 在本教程中,您将了解迭代器的工做原理,以及如何使用__iter__
和__next__
方法构建本身的迭代器。html
迭代器在Python中无处不在。 它们优雅地实如今循环,推导,生成器等中,但隐藏在明显的视觉中。python
Python中的迭代器只是一个能够迭代的对象。一个将一次返回数据的对象或一个元素。shell
从技术上讲,Python迭代器对象必须实现两个特殊的方法__iter__()
和__next__()
,统称为迭代器协议。yii
若是咱们从中获取一个迭代器,那么一个对象被称为iterable
。 大多数Python中的内置容器是列表,元组,字符串等都是可迭代的。函数
iter()
函数(这又调用__iter__()
方法)返回一个迭代器。oop
使用next()
函数来手动遍历迭代器的全部项目。当到达结束,没有更多的数据要返回时,它将会引起StopIteration
。 如下是一个例子。ui
# define a list my_list = [4, 7, 0, 3] # get an iterator using iter() my_iter = iter(my_list) ## iterate through it using next() #prints 4 print(next(my_iter)) #prints 7 print(next(my_iter)) ## next(obj) is same as obj.__next__() #prints 0 print(my_iter.__next__()) #prints 3 print(my_iter.__next__()) ## This will raise error, no items left next(my_iter)
更优雅的自动迭代方式是使用for
循环。 使用for
循环能够迭代任何能够返回迭代器的对象,例如列表,字符串,文件等。spa
>>> for element in my_list: ... print(element) ... 4 7 0 3
在上面的例子中看到的,for
循环可以自动经过列表迭代。code
事实上,for
循环能够迭代任何可迭代对象。咱们来仔细看一下在Python中是如何实现for
循环的。htm
for element in iterable: # do something with element
实际上它是以相似下面的方式来实现的 -
# create an iterator object from that iterable iter_obj = iter(iterable) # infinite loop while True: try: # get the next item element = next(iter_obj) # do something with element except StopIteration: # if StopIteration is raised, break from loop break
因此在for
的内部,for
循环经过在可迭代的对象上调用iter()
来建立一个迭代器对象iter_obj
。
有意思的是,这个for
循环其实是一个无限循环~..~。
在循环中,它调用next()
来获取下一个元素,并使用该值执行for
循环的主体。 在全部对象耗尽后,引起StopIteration
异常,内部被捕获从而结束循环。请注意,任何其余类型的异常都将正常经过。
构建迭代器在Python中很容易。只须要实现__iter__()
和__next__()
方法。
__iter__()
方法返回迭代器对象自己。若是须要,能够执行一些初始化。
__next__()
方法必须返回序列中的下一个项目(数据对象)。 在到达结束后,并在随后的调用中它必须引起StopIteration
异常。
在这里,咱们展现一个例子,在每次迭代中给出下一个2
的几回方。 次幂指数从零开始到用户设定的数字。
class PowTwo: """Class to implement an iterator of powers of two""" def __init__(self, max = 0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration
如今能够建立一个迭代器,并经过它迭代以下 -
>>> 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
迭代器对象中的项目没必要都是可耗尽的,能够是无限迭代器(永远不会结束)。 处理这样的迭代器时必定要当心。
下面是用来演示无限迭代器的一个简单的例子。
内置的函数iter()
能够用两个参数来调用,其中第一个参数必须是可调用对象(函数),而第二个参数是标头。迭代器调用此函数,直到返回的值等于指定值。
>>> int() 0 >>> inf = iter(int,1) >>> next(inf) 0 >>> next(inf) 0
能够看到,int()函
数老是返回0
,因此将它做为iter(int,1)
传递将返回一个调用int()
的迭代器,直到返回值等于1
。这历来没有发生,因此这样就获得一个无限迭代器。
咱们也能够创建本身的无限迭代器。 如下迭代器理论上将返回全部奇数。
class InfIter: """Infinite iterator to return all odd numbers""" 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
当迭代这些类型的无限迭代器时,请注意指定终止条件。
使用迭代器的优势是它们能够节省资源。 如上所示,咱们能够得到全部奇数,而不将整个系统存储在内存中。理论上,能够在有限的内存中计算有无限的项目。
原文出自【易百教程】,商业转载请联系做者得到受权,非商业转载请保留原文连接:https://www.yiibai.com/python/iterator.html