可迭代的对象与迭代器详解

可迭代的对象

使用iter内置函数可以获取迭代器的对象。如果对象实现了能返回迭代器的iter方法,那么对象就是可迭代的。序列都可以迭代;实现了getitem方法,而且其参数是从零开始的索引,这种对象也可以迭代。

class IterObj(object):
    """
    [1,2] => (1,2)
    [1,2,3] => (1,2),(3,None)
    """
    def __init__(self, l):
        if len(l)%2:
            l.append(None)
        self.l = l

    def __iter__(self):
        # 返回生成器
        return ((self.l[i], self.l[i+1]) for i in range(0, len(self.l), 2))

if __name__ == '__main__':
    # 该对象可以迭代但是并不是迭代器
    t = IterObj([1, 2, 3])
    # 执行next操作会报错
    # next(t)
    # Traceback (most recent call last):
    #     File ".\iter_obj.py", line 19, in <module>
    #         next(t)
    # TypeError: 'IterObj' object is not an iterator
    # 但是可以执行for操作
    # for i in t:
    #     print(i)
    # (1, 2)
    # (3, None)
    # 可迭代的对象可以通过iter转换为迭代器
    # iter(t)

迭代器

迭代器是这样的对象:实现了无参数的next方法,返回序列中的下一个元素;如果没有元素了,那么抛出StopIteration异常。Python中的迭代器还实现了iter方法,因此迭代器也可以迭代。

class Iterator(object):
    """
    [1,2] => (1,2)
    [1,2,3] => (1,2),(3,None)
    """
    def __init__(self, l):
        if len(l)%2:
            l.append(None)
        self.l = l
        self.index = 0

    def __iter__(self):
        # 返回生成器
        return self

    def __next__(self):
        try:
            return (self.l[self.index], self.l[self.index+1])
        except IndexError:
            raise StopIteration()
        finally:
            self.index += 2

if __name__ == '__main__':
    # 该对象是迭代器
    iterator = Iterator([1, 2, 3])
    # for i in iterator:
    #     print(i) 
    # print(next(iterator))
    # print(next(iterator))

可迭代的对象和迭代器的关系

可迭代的对象有个iter方法,每次都实例化一个新的迭代器;而迭代器要实现next方法,返回单个元素,此外还要实现iter方法,返回迭代器本身。

因此,迭代器可以迭代,但是可迭代的对象不是迭代器。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本节课纲 可迭代对象 迭代器 生成器Python中内置的序列,如list、tuple、str、bytes、dict...
    郭_扬阅读 5,022评论 0 0
  • 1.可迭代的对象 定义:可迭代的对象(Iterable)是指使用iter()内置函数可以获取迭代器(Iterato...
    C_Z_Q_阅读 3,255评论 0 1
  • 迭代器模式:一种惰性获取数据项的方式,即按需一次获取一个数据项。 关于迭代器和生成器的区别:在Python社区中,...
    Zoulf阅读 4,829评论 0 1
  • 前言 在学Python时,我对于生成器和迭代器理解得不清楚,检索到了一篇文章,把这两个东西讲得很透,应该是我能找到...
    backup备份阅读 5,420评论 1 3
  • 临江仙-和网友 美梦还嫌太短,醒来犹恋黄粱。 须知因果总相当。地前多汗水,秋后谷盈仓。 富贵存仁循理,贫穷笃志安常...
    田园读书人阅读 4,012评论 6 8