迭代器

迭代器

什么是迭代器:

迭代器可以让我们访问集合的时候变得非常方便。我们通过for...in...的方式访问一个集合的时候,就是使用迭代器完成的。如果没有迭代器,那么我们只能通过while循环,每次循环的时候通过下标访问了。

可迭代的对象:

可以直接使用for循环遍历的对象,成为可迭代的对象,常见的可迭代的对象有:listtupledictsetstr以及生成器。
更加专业的判断一个对象是否是可迭代的对象是:这个对象有一个__iter__方法,并且这个方法会返回一个迭代器对象,这种对象就叫做可迭代的对象。

判断一个对象是否可迭代:

可以使用isinstance()判断一个对象是否是Iterable的对象:

    from collections import Iterable
    # 列表是一个可迭代的对象
    ret = isinstance([1,2,3],Iterable)
    print(ret)

    # 字符串是一个可迭代的对象
    ret = isinstance("abc",Iterable)
    print(ret)

    # 整形不是一个可迭代的对象
    ret = isinstance(123,Iterable)
    print(ret)

迭代器:

  1. Python2中,实现了next方法和__iter\__方法,并且在这个方法中返回了值的对象,叫做迭代器对象。
  2. Python3中,实现了__next__方法和方法__iter__方法,并且这个方法返回了值的对象,叫做迭代器对象。
  3. 如果迭代器没有返回值了,那么应该在next或者是__next__方法中抛出一个StopIteration异常。

使用iter()方法获取可迭代对象的迭代器:

有时候我们拥有了一个可迭代的对象,我们想要获取这个迭代器,那么可以通过iter(x)方法获取这个可迭代对象的迭代器。

自定义迭代器:

    class MyRangeIterator(object):
        """
        迭代器
        """
        def __init__(self,start,end):
            self.index = start
            self.end = end

        def __next__(self):
            if self.index < self.end:
                index = self.index
                self.index += 1
                return index
            else:
                raise StopIteration()


    class MyRange(object):
        """
        可迭代对象
        """
        def __init__(self,start,end):
            self.start = start
            self.end = end

        def __iter__(self):
            return MyRangeIterator(self.start,self.end)


    # 初始化一个可迭代的对象
    for x in MyRange(1,10):
        print(x)

    # 使用itre函数将可迭代的对象转换为迭代器
    range_iterator = iter(MyRange(1,10))

    # 不能遍历迭代器,只能通过next来迭代
    for x in range_iterator:
        print(x)

 

posted @ 2021-03-06 10:45  大碗炸酱面  阅读(42)  评论(0编辑  收藏  举报