zoukankan      html  css  js  c++  java
  • Python迭代器与生成器

    一、什么是迭代器协议

      1.迭代器协议是指:对象必须提供一个next()方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前退)

      2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)

      3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象

    可迭代对象

    可迭代对象泛指一类对象,不是指的每一种对象,确切的说满足以下的条件的对象可以成为可迭代对象:

    1. 对象实现了__iter__方法

    2. __iter__方法返回了一个迭代器对象(即__iter__的作用

    我们比较容易理解的可迭代对象,比如说可以用for语句去遍历,实际for语句的内部实现应该就是首先调用对象的__iter__方法,获取一个迭代器对象,接着不停的调用迭代器对象的__next__方法,循环遍历取值。

    迭代器对象(迭代器)

    迭代器包括这些条件:

    1.对象实现了__next__方法

    2.__next__方法返回了某个数值(当然一般情况下,我们需要的是返回这个对象的特定的数字,并且按照一定的顺序进行依次返回)

    3.__next__方法需要在值取完的时候,抛出StopIteration的错误信息。

    判断是可迭代对象还是迭代器对象的方法

    判断迭代器 : isinstance([], Iterator)。

    判断可迭代对象:  isinstance([], Iterable)。

    总结:

    可迭代对象调用对象的__iter__方法能够返回迭代器对象的一种对象

    迭代器对象是实现了迭代器协议的对象。

    迭代器应用

     运行主函数

     

    二、什么是生成器?

    可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己的内置的__iter__方法),所以生成器就是可迭代对象

    1.生成器函数:常规函数的定义,但是,使用yield语句而不是return语句返回结果yield语句语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行

     2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

    为何使用生成器(生成器的特点)

    Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。

    生成器小结

    a.是可迭代对象

    b.实现了延迟计算,省内存

    c.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处

  • 相关阅读:
    关于jabber协议
    xmpp相关链接,
    Implementation of the Server Dialback method as defined by the RFC3920
    好吧,隐藏的文件,
    Vue之methods watch和compute的区别和联系
    面向过程编程&面向对象编程
    JS高阶---线程与事件机制(小结)
    Vuex简介
    Vuex操作步骤
    vue单页面应用刷新网页后vuex的state数据丢失的解决方案
  • 原文地址:https://www.cnblogs.com/sunny0824/p/13693490.html
Copyright © 2011-2022 走看看