Python 生成器

    生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。调用该函数将返回一个可用于生成连续 x 值的生成【Generator】,简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用,如下就是一个生成器:

In [3]: gen = (i for i in range(5))     # 创建一个生成器

In [4]: gen.next()    # next()方法可以每次调用一个值,然后退出函数
Out[4]: 0

In [5]: gen.next()    # 下一次调用生成器的时候又从上次中断的地方开始执行
Out[5]: 1

In [6]: gen.next()    # 如果我们使用for循环去遍历生成器里的值,相当于执行多次next()方法
Out[6]: 2

我们自己写一个生成器:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

def fun():
    print('one')
    yield 1
    print('two')
    yield 2
    print('three')
    yield 3

gen = fun()   # 因为函数里有yield语句,所以调用的时候函数不会被执行,只是返回一个生成器对象,只有使用next()方法才会被执行
gen.next()    # 第一次会执行print('one'),然后在 yield 1 的位置中断,1是返回值(return),返回值后函数退出,并记录中断位置
gen.next()    # 第二次会执行print('two'),然后在 yield 2 的位置中断,2是返回值(return),返回值后函数退出,并记录中断位置
gen.next()    # 第三次会执行print('three'),然后在 yield 3 的位置中断,3是返回值(return),返回值后函数退出,并记录中断位置

return 与 yield 区别:

(1) return的时候这个函数的局部变量就都销毁了,所有return是得到所有结果之后的返回
(3) yield是产生了一个可以恢复的函数(生成器),恢复了局部变量;生成器只有在调用 next() 时才运行函数生成一个结果

    

     

原文地址:https://www.cnblogs.com/pzk7788/p/10296949.html