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)