Miao Love

python迭代器

迭代器

  • 在python中,对list,tuple,str等类型的数据可以使用for …in … 的循环语法,从其中依次拿到数据进行使用,这样的过程称为遍历,也叫迭代。
  • 在python中,基本类型,列表,元组,字符串,字典都是可迭代的,而整数,浮点数,布尔数都是不可迭代的。

可迭代对象的本质

  • 对可迭代对象进行迭代使用的过程,没迭代一次都会返回对象中的下一条数据,一直向后读取数据知道迭代了所有数据后结束。
  • 在这个过程中,我们需要知道每次访问了第几条数据,以便下一次迭代返回的是下一条数据,不会跳过或者返回数据。python帮我们实现了这个功能,就是迭代器。
  • 在python中,可迭代对象通过—iter—方法向我们提供一个迭代器,在迭代一个对象的时候,实际上就是先获取该对象的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据。
  • 可迭代对象是一个具备了—iter—方法的对象,通过—iter—方法获取可迭代对象的迭代器。

iter()函数与next()函数

  • 列表、元组、字符串、字典等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。

    1
    2
    3
    4
    5
    6
    7
    8
    list_b = ['ppp', 'yyy', 'ttt', 'hhh', 'ooo', 'nnn']
    iterator_b = iter(list_b)
    print(next(iterator_b))
    print(next(iterator_b))
    print(next(iterator_b))
    print(next(iterator_b))
    print(next(iterator_b))
    print(next(iterator_b))
  • 执行结果

    1
    2
    3
    4
    5
    6
    7

    ppp
    yyy
    ttt
    hhh
    ooo
    nnn
  • iter()函数是把可迭代对象的迭代器取出来,内部是调用了可迭代对象的—iter—方法,来取得迭代器的。

  • next()函数是通过迭代器取得下一个位置的值,内部是调用了迭代器对象的—next—方法,来取得下一个位置的值。

  • 当我们迭代完最后一个数据之后,再次调用next()函数会抛出Stoplteration的异常,来告诉我们数据全部迭代完毕,不再执行next()函数。

自定义迭代器

  • 迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。

  • 如果返回的数据值不是在一个已有数据集合中,而是通过程序按照一个规律计算好的生成,那就不在依赖一个已有数据集合,也就是说不用再将所有的迭代的数据一次性缓存下来,这样可以节省大量的储存空间。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    class Feibolterator():
    """斐波那契额数列迭代器"""
    def __init__(self,n):
    #费波数列值的个数
    self.n = n
    #记录当下遍历的下标
    self.index = 0
    # 斐波那契数列前面俩个值
    self.num1 = 0
    self.num2 = 1

    def __next__(self):
    """使用next()函数调用获取下一个数"""
    if self.index < self.n:
    num = self.num1
    self.num1,self.num2 = self.num2,self.num1 + self.num2
    self.index +=1
    return num
    else:
    raise StopIteration

    def __iter__(self):
    """迭代器的_iter_返回自身即可"""
    return self

    if __name__ == '__main__':
    fb = Feibolterator(20)
    for num in fb:
    print(num,end=",")
  • 执行结果

    1
    0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,
  • 通过上面的代码中,我可以看到自定义一个类,里面实现了—next—和—iter—方法,next方法中每次返回的值是通过计算得到的结果,结果可以一直使用next()方法。

打赏