需要掌握:
python面向对象-__iter__、__next__和迭代器原理
概述
python内置函数iter()有缺点,参见:
https://www.malaoshi.top/show_1EF4a3mEiecs.html
创建类IterPlus,可以传入list、tuple,返回迭代器,并且该迭代器可进行多次for in和while循环
也就是说:类IterPlus,是增强版的 iter()
实现
#coding=utf-8
class IterPlus:
def __init__(self,array):
self._array=array
self._index=0
def __iter__(self):
print("__iter__")
'''
每次执行for语句迭代时,首先会执行一次该方法(在一个for语句中,仅执行一次)
将迭代时的当前位置重置为0,如不重置,再次遍历时__index还是最大值,在执行__next__()方法时直接抛出StopIteration异常
'''
self._index=0
return self
def __next__(self):
'''
然后每次循环时都会执行该方法,直到抛出StopIteration异常终止
'''
length=len(self._array)
if self._index >=length:
# 支持多次while循环
self._index=0
raise StopIteration
else:
ret=self._array[self._index]
self._index+=1
return ret
判断是否Iterator
if __name__ == "__main__":
ma=ArrayIter([1,2,3,4,5])
from collections import Iterator
print(isinstance(ma,Iterator))
当一个类实现了__iter__()和__next__()方法后,就是迭代器了
支持多次for in循环
l=[1,2,3,4,5]
it=IterPlus(l)
for i in it:
print(i)
for i in it:
print(i)
注意:
for 语句会调用 一次
__iter__()方法,重置self._index,所以可以循环多次在for语句中 不要调用
next()
支持多次while循环
l=[1,2,3,4,5]
it=IterPlus(l)
while True:
try:
print(next(it))
except StopIteration as e:
break
while True:
try:
print(next(it))
except StopIteration as e:
break
注意:
while语句不会调用
__iter__()方法,也就不会重置self._index在抛出
StopIteration异常前重置self._index,所以可以支持多次while循环直到抛出
StopIteration异常才会终止
与内置iter()函数比较
python内置iter()函数,不支持多次for...in 语句 和 多次 while 语句
IterPlus支持