Python生成器的用法,使用生成器灵活的生成斐波那契数列

生成器,一定情况下可以节省很多空间

比如:

>>> b = (x for x in range(10))

>>> b

<generator object <genexpr> at 0x02A17120>   就是一个生成器,

的内存空间要比列表小得多

需要取值的话,可以next()函数,或者__next__()方法,比如取上面的b的值:

>>> next(b)

0

>>> b.__next__()

1

>>> next(b)

2

>>> b.__next__()

3

>>>……

Ps:当然也可以使用for遍历b的值

 

生成器的另外一写法应用:

斐波那契数列是说后面一个数始终是前面两个数的和比如:1,1,2,3,5,8,13,21……,可以使用下面的方式来创建这样的一组数:

def createNum():

        print("start----------------")

        a,b = 0,1

        for i in range(1000):

                #只要函数里面有yield这个关键字,就表示这个函数是一个生成器

                yield b               

                a,b = b,a+b

        print("stop--------")

 

a = createNum()

 

第一次next(a),上面这个函数的执行步骤

1、 执行print("start----------------")

2、 a = 0, b = 1

3、 第一次循环,走到yield b,打印一个b出来,当前是1遇到yield程序停止往下运行

4、 第二次next(a),程序继续执行,从刚才停止的位置yield b的下面开始,也就是执行a,b = b,a+b此时b=0+1=1,然后进行第二次for循环又一次执行到yield b,打印b的值为1又一次停止运行。

5、 再次next(a)重复上面的步骤,打印2出来

6、 直到for循环完毕

 

这个生成器的作用就是说你可以事先定义一个可以成很多斐波那契数列的数值的一个函数,这个函数占用空间很小,到需要的时候,再next函数去生成,需要多少个就next多少次

 

 

另外,还有一种情况,可以完成两个函数交叉调用:

def test1():                  #定义一个带有yield None的生成器

    while True:

    print(“----111------”)

    yield None


def test2():             #定义另外一个带有yield None的生成器

    while True:

    print(“----222------”)

    yield None

 
a = test1()         #创建两个生成器对象

b = test2()

def test():           #定义一个函数,调用生成器对象

    while True:

        a.__next__()

        b.__next__()
#调用test test() 结果:
----111------ ----222------ ----111------ ----222------ ----111------ ----222------ ----111------ ----222------ ……

 

posted @ 2019-12-17 13:40  白杨的博客  阅读(629)  评论(0编辑  收藏  举报