什么是迭代器?

迭代器可以让我们访问集合的时候变得非常方便。之前我们通过for...in...的方式访问一个集合的时候,就是使用迭代器完成的。如果没有迭代器,那么我们只能通过while循环,每次循环的时候通过下标访问了。

 

可迭代对象

可以直接使用for循环遍历的对象,成为可迭代的对象,常见的可迭代的对象有:listtupledictsetstr以及生成器。
更加专业的判断一个对象是否是可迭代的对象是:这个对象有一个__iter__方法,并且这个方法会返回一个迭代器对象,这种对象就叫做可迭代的对象。

 

isinstance() 判断对象是否可迭代

ret = isinstance([1,2,3],Iterable)
print(ret)        #ret的值为True

 

自定义迭代器

    class MyRangeIterator(object):
        """
        迭代器
        """
        def __init__(self,start,end):
            self.index = start
            self.end = end

        def __next__(self):
            if self.index < self.end:
                index = self.index
                self.index += 1
                return index
            else:
                raise StopIteration()


    class MyRange(object):
        """
        可迭代对象
        """
        def __init__(self,start,end):
            self.start = start
            self.end = end

        def __iter__(self):
            return MyRangeIterator(self.start,self.end)


    # 初始化一个可迭代的对象
    for x in MyRange(1,10):
        print(x)

这里有两个重要对的魔术方法,__iter__与__next__。魔术方法不会被显式的调用,只有在for in 遍历这个对象时,会先调用__iter__获得一个迭代器,然后再调用这个迭代器的__next__方法获取可迭代对象。魔术方法会被隐式的执行的!这个过程也是f用for遍历的底层做的事情。
 

想获得一个迭代器必须经过__iter__,要想获得可迭代对象就要使用__next__方法,两者天生一对,不可或缺!

 

iter(x)方法

有时候我们拥有了一个可迭代的对象,我们想要获取这个迭代器,那么可以通过iter(x)方法获取这个可迭代对象的迭代器。

# 使用itre函数将可迭代的对象转换为迭代器
range_iterator = iter(MyRange(1,10))