迭代器

199 阅读1分钟
from collections import Iterable
from collections import Iterator

import time

class MylistIter(object):
"""MyList迭代器类 专门用来迭代访问mylist中的数据 """
    def __init__(self, data):
        self.data = data
    # 记录位置信息
        self.index = 0

    def __next__(self):
    """迭代器 通过__next__方法提供迭代访问数据的功能  内部会记录相关的位置信息
    next(迭代器对象)--迭代器对象.__next__()"""
    # 先暂时把当前位置的数据存起来
    if self.index < len(self.data):
        data = self.data[self.index]
        self.index += 1
        print("当前下标是%d" % self.index)
        # time.sleep(1)
        return data
    else:
        # 如果用户已经访问完成所有的数据了 应该抛出一个StopIteration异常
        # for内部已经封装了对 异常StopIteration的处理
        # 当for内部接收异常的时候 就知道了应该是迭代完成
        raise StopIteration

# 对于迭代器来讲 迭代器也是可迭代对象 iter(mylistiter) ==> mylisiter.__iter__()
# __iter__(mylisiter)
     def __iter__(self):
        return self

class Mylist(object):
     def __init__(self):
        self.data = [1,2,3,4,5]
     def __iter__(self):
    """可迭代对象需要实现这个方法
    可迭代对象的本质就是通过__iter__方法提供一个可以遍历数据的迭代器"""
        mliter = MylistIter(self.data)
        return mliter

# 创建一个对象 -实例对象
ml = Mylist()
print(isinstance(ml, Iterable))

mliter = iter(ml)
print(isinstance(mliter, Iterator))
# iter(ml) 等价于 ml.__iter__()
# for循环遍历可迭代对象的 过程模拟
# 1 iter(ml) == ml.__iter__() 获取迭代器对象mylistiter<可以用以迭代访问对象中存储的数据>
# 2 next(mylistiter) == mylistiter.__next__() 获取元素的值 并且将位置往后移动
# 3 第2步会一直执行下去 直到__next__()当中抛出StopIteration异常
for data in ml:
     print(data)