美文网首页
迭代器和生成器 (Iterator & Generator)

迭代器和生成器 (Iterator & Generator)

作者: 一秆子数码 | 来源:发表于2017-09-05 20:44 被阅读0次

    迭代器

    迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。

    __iter__()和next()方法

    这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素。对于可迭代对象,可以使用内建函数iter()来获取它的迭代器对象:

    iter()可以接受多种Python对象为参数,比如list,tuple, dict, set等,并将其转化为迭代器。迭代器可以用于for语句或in语句中。很多常用操作也是支持迭代器的,比如sum(),max()等。

    生成器

    在Python中,使用生成器可以很方便的支持迭代器协议。生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果,在每个结果之间挂起和继续它们的状态,来自动实现迭代协议。

    也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态。

    什么是生成器?

    保存了生成结果的的算法结构,可以推算出后面的元素。

    没有生成所有结果值,也没有存到内存中。效率提高。

    这些数字并没有生成,也没有存到内存中。

    生成器对象,只是保存了生成这些数字的算法结构,可以推算出后面的元素。

    这样,如果需要取特定的内存,而不是全部加载。

    效率提高。

    生成器的第一种方式:

    ge = (x  for  x  in  range(1000000))

    print(ge)

    print(type(ge))

    3.yield用法:

    生成器的第二种方式:

    1、定义函数

    2、函数中有yield值


    当调用生成器函数的时候,函数只是返回了一个生成器对象,并没有 执行。

    当next()方法第一次被调用的时候,生成器函数才开始执行,执行到yield语句处停止

    next()方法的返回值就是yield语句处的参数(yielded value)

    当继续调用next()方法的时候,函数将接着上一次停止的yield语句处继续执行,并到下一个yield处停止;如果后面没有yield就抛出StopIteration异常

    总结:

    Generator:生成器,保存算法,可以推算出下一个

    Iterator:迭代器:从对象的第一个元素开始访问,直到所有的元素被访问结束。

    Iterable:生成器是可以迭代的,也可以理解为可迭代的对象

    通过实现迭代器协议对应的__iter__()和next()方法,可以自定义迭代器类型。对于可迭代对象,for语句可以通过iter()方法获取迭代器,并且通过next()方法获得容器的下一个元素。

    像列表这种序列类型的对象,可迭代对象和迭代器对象是相互独立存在的,在迭代的过程中各个迭代器相互独立;但是,有的可迭代对象本身又是迭代器对象,那么迭代器就没法独立使用。

    itertools模块提供了一系列迭代器,能够帮助用户轻松地使用排列、组合、笛卡尔积或其他组合结构。

    生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和next()方法。

    生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果

    相关文章

      网友评论

          本文标题:迭代器和生成器 (Iterator & Generator)

          本文链接:https://www.haomeiwen.com/subject/mjspjxtx.html