欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python中迭代器的实现

程序员文章站 2022-05-03 18:06:18
...
  1. 迭代
    根据记录的前面的元素的位置信息 去访问后续的元素的过程 -遍历

  2. 可迭代对象 iterable

    能够使用for循环遍历的对象

     for item in obj:
    
         print(item)
    

    isinstance(对象,类型) 判断对象是否是 类型的实例对象

    from collections import Iterable
    isinstance(obj, Iterable)
    
  3. 可迭代对象

    可迭代对象通过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)