生成器

一边循环一边计算的机制,称为生成器(generator)

  • 每取走一个值,函数会继续生成一个新的值。这样的函数就像是不停生产的机器
  • 特别之处在于调用生成器函数时,其函数体并没有被执行。只有执行next()的时候,才开始执行。
  • for in操作会自动调用生成器的.next()方法

创建生成器:

  • 创建生成器的方法很多。通过把一个列表生成式的[]改成(),就创建了一个generator
    >>> L = [x * x for x in range(10)]
    >>> L
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x104feab40>
  • 在函数中使用yield后,函数就变成生成器
    
    def fib():
    a, b = 0, 1
    while 1:
        yield b
        a, b = b, a+b

c = fib()



### 应用:
* 给予了python懒惰求值(Lazy evaluation)的能力。通俗的说,就是只有在某个值被用到的时候,它才会被计算出来
* 特别适合做一些运算结果大,甚至大到无法分配足够的内存来储存这个结果的任务
* 利用生成器把控制循环的代码与真正的功能代码分离开来
* 生成器的“杀手级”应用就是实现协程(coroutine)
最后由 oucb 编辑于2016年05月04日 12:41