python 生成器

迭代器

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

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

生成器

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

def fib(n):
    curr=1
    prev=0
    for i in range(0,10):
                yield curr
                prev,curr=curr,curr+prev


print [i for i in fib(10)]
----
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

yield 对应的值在函数被调用时不会立刻返回,而是调用next方法时(本质上 for 循环也是调用 next 方法)才返回

生成器表达式

>>> l=(x for x in range(0,10) if x !=0)
>>> print l
<generator object <genexpr> at 0x7f7cab3abaf0>
>>> [i for i in l]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • @Author : Roger TX (425144880@qq.com) @Link : https:/...
    Roger田翔阅读 207评论 0 0
  • 前言 作为python程序员,生成器以及协程是必不可少的话题。你可能在面试中会经常遇到这样的问题:说一说生成器和迭...
    pullgon阅读 498评论 0 0
  • 1.迭代 在理解生成器之前,先理解迭代。 1.1 迭代 如果给定一个list或tuple,我们可以通过for循环来...
    XYZeroing阅读 856评论 1 3
  • Python之生成器 生成器在Python社区,生成器和迭代器被看作一种工具,生成器的本质就是迭代器。唯一的区别就...
    免跪姓黄阅读 390评论 0 10
  • 迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代...
    Mr_Bluyee阅读 1,060评论 0 1