跳转至

22. 迭代器(高级)

迭代器(高级)

    什么是迭代器
        由iter(iterable) 函数返回,可以通过next(iterator) 函数取值的对象就是迭代器

    迭代器协议
        迭代器协议是指对象能够使用next()函数获取下一项数据,在没有下一项数据时触发一个StopIteration异常来终止迭代的约定

    迭代器协议的实现方法
        def __next__(self):
            ...
        注: 此方法需要实现迭代器协议

    什么是可迭代对象
        是指能用iter(obj) 函数返回迭代器的对象
        可迭代对象内部要定义__iter__(self) 方法来返回迭代器对象
# 此示例示意将自定义的类MyList创建的对象制作为可迭代对象
class MyList:
    '''这是一个自定义的列表类型,此类型的对象用data属性绑定的列表来存储数据'''
    def __init__(self, iterable=()):
        self.__data = [x for x in iterable]

    def __repr__(self):
        return 'MyList(%s)' % self.__data

    def __iter__(self):
        '''此方法用来返回一个能访问self对象'''
        '''此方法用来返回一个能访问self对象迭代器'''
        # return iter(self.__data)
        return MyListIterator(self.__data)

class MyListIterator:
    '''此类用来描述能够访问MyList类型的对象的迭代器'''
    def __init__(self, lst):
        self.__data_lst = lst
        self.__cur_index = 0  #迭代器的起始位置

    def __next__(self):
        '''此方法用来实现迭代器协议'''
        if self.__cur_index >= len(self.__data_lst):
            raise StopIteration
        r = self.__data_lst[self.__cur_index]
        self.__cur_index += 1
        return r


myl = MyList([2, 3, 5, 7])
# ################
it = iter(myl)  # 等同于it = myl.__iter__()
print(next(it))  # 2
# ################
for x in myl:
    print(x)