python实现增强版的iter()

需要掌握:
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支持


原文出处:/show_1EF4a1Jr5ASC.html