python中迭代器的实现
程序员文章站
2022-05-03 18:06:18
...
迭代
根据记录的前面的元素的位置信息 去访问后续的元素的过程 -遍历-
可迭代对象 iterable
能够使用for循环遍历的对象
for item in obj: print(item)
isinstance(对象,类型) 判断对象是否是 类型的实例对象
from collections import Iterable isinstance(obj, Iterable)
-
可迭代对象
可迭代对象通过iter方法提供一个 可以遍历对象中数据的工具-迭代器
iter(可迭代对象) 可以获取可迭代对象的迭代器通过迭代器可以迭代访问 数据
next(迭代器) ===== 迭代器对象.next()
如果需要实现一个迭代器 就需要实现next()class MylistIter(object): ''' Mylist迭代器类 专门用来迭代访问mylist中的数据''' def __init__(self,data): self.data = data # 记录位置信息 self.index = 0 def __next__(self): ''' 迭代器 通过__next__方法提供迭代访问数据的功能 内部会记录相关的位置信息 next(迭代器对象) == 迭代器对象.__next__()''' # 先暂时把当前位置的数据存储起来 if self.indef < len(self.data): data = self.data[self.index] self.index += 1 return data else: # 如果用户已经访问完成所有的数据了 应该抛出一个StopIteration异常 # for内部已经封装了对 异常StopIteration的处理 # 当for内部接收异常的时候 就知道了应该是迭代完成 raise StopIteration # 对于迭代器来讲 迭代器也是可迭代对象 iter(mylistiter) ==> mylisiter.__iter__() def __iter__(self): return self class Mylist(object): def __init__(self): self.data = [1,2,3,4,5] def __iter__(self): ''' 可迭代对象需要实现这个方法 可迭代对象的本质就是通过__iter__方法提供一个可以遍历的数据的迭代器''' mliter = MyIister(self.data) return mliter # 创建一个对象 -实例对象 ml = Mylist() print(isinstance(ml, Iterable)) mliter = iter(ml) print(isinstance(mliter, Iterator)) for data in ml: print(data)
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)