本博文源于python基础,旨在实现如何完成一个迭代器。首先大家不要对迭代器感到陌生。迭代器就是for能遍历的对象,而且需要大家懂一点面向对象的知识,这是基础。
迭代器必备两种属性
大家在自己设计迭代器的时候,一定要遵守迭代器协议。所谓迭代器协议就是要有两个属性
前者返回对象本身,它是for语句使用迭代器的要求
后者返回容器中下一个元素或数据。当容器中的数据用尽时,应该引发StopIteration异常。
任何一个类,只要它实现了或具有这两个方法,就可以称其为迭代器,也可以说是可以迭代的。在使用它作为迭代器时,就可以用for来遍历:
for item in iterator:
pass
手动实现__iter__
刚才我们上面说了__iter__是指对象本身,那么我们在设计的时候用类构造,然后在类中定义该iter方法就行了。定义好方法,写些什么语句呢?根据公约返回对象本身,因此可以这样写
def __iter__(self):
return self
手动实现__next__
也就是返回下一个元素或数据,你是想让数据怎样的操作呢,是两倍或者三倍还是平方都是可以自己选择。在这个方法中,就需要脑洞大开,根据自己的业务需求实施了,这里就来一个是容器的两倍next
def __next__(self):
if self.__x and self.__x != 1:
self.__mul *= self.__x
代码友好性须知
作为类要有__init__
这个初始化是类的标准素养,默认属性更加友好哟!
作为迭代器到了迭代结束抛出异常哟!
这个有StopIteration异常可以设置
下面就来看一下样例启发一下思路吧!
例子:自定义一个迭代器实现2的n次方值,最大不超过100
class MyIterator:
def __init__(self,x=2,xmax=100):
self.__mul, self.__x = x,x
self.__xmax = xmax
def __iter__(self):
return self
def __next__(self):
if self.__x and self.__x != 1:
self.__mul *= self.__x
if self.__mul <= self.__xmax:
return self.__mul
else:
raise StopIteration
else:
raise StopIteration
if __name__ == '__main__':
myiter = MyIterator()
for i in myiter:
print('迭代的数据元素:',i)