美文网首页python
生成器,迭代器理解

生成器,迭代器理解

作者: 一曲广陵散 | 来源:发表于2017-03-11 16:45 被阅读16次

    引用
    看完这篇,你就明白生成器是什么

    一,概述

    生成器是Python编程中的高级技能,但是各种项目中可以随处见到生成器的身影,所以不得不去理解,使用它
    提到生成器,总不可避免的把迭代器拉出来对比,生成器是一个在行为上和迭代器非常类似的对象
    如果将迭代器比成Android,生成器是IOS,两者功能是差不多,但是生成器更加优雅

    二,迭代器

    迭代器用于迭代操作(for循环)的对象,像列表一样可以获取其中的每一个元素
    任何实现了__next__方法(python2中是next)的对象都可以称其为迭代器

    它和列表的区别在于,构建迭代器的时候,不像列表将所有的元素一次性加载到内存中,而是以一种
    延迟计算(lazy evaluation)的方式返回元素
    这正是它的优点,比如列表中含有一千万个整数,需要占超过400M的内存,而使用迭代器只需要使用几十字节的空间,因为它并没有将所有的元素装载到内存中,而是等到调用next方法的时候,才返回该元素(call by need),本质上for 循环就是不断的调用迭代器的next方法

    三,生成器

    知道迭代器之后,可以正式进入生成器的话题了,普通函数用return返回一个值,和
    Java等其他语言一样,然而在Python中还有一种函数,用关键字yield来返回值
    这种函数叫生成器函数,函数被调用时候会返回一个生成器对象,
    生成器本质上还是一个迭代器,也是用在迭代操作中,因此它和迭代器一样的特性
    唯一的区别是实现方式上不一样,后者更加简洁

    fun就是一个生成器函数,调用该函数时候返回对象就是生成器g,
    这个生成器对象的行为和迭代器是非常相似的,可以用在for 循环等场景中
    yield对应的值在函数被调用的时候不会立刻返回,而是调用next方法的时候才返回
    (本质上for 循环也是调用next方法)

    为什么要使用生成器呢?显然,用生成器没有那么多冗余的代码,而且性能上一样的高效,为什么不用呢?

    四,生成器表达式

    生成器表达式和列表推导式很像,但是它们返回的对象不一样,
    生成器返回生成器对象,列表推导式返回列表对象

    相关文章

      网友评论

        本文标题:生成器,迭代器理解

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