python之生成器

生成器


 

  我们知道如果我们要循环输出一个列表的时候,一般情况下,在我们输出它们之前,列表里面的元素已经准备就绪了,这也就意味着,在内存中这些元素已经存在。那么问题来了,如果我们的这个列表内容很多,我们的内存可能需要很多的空间来存放这些元素,从成本角度来说,这显然是不划算的。这时候我们的主人公生成器就有话要说了,节省成本哪家强,当然找我生成器。

  那么我们的生成器的性质是咋样的呢?Let me tell you!

  生成器有一种即取即用的性质,就是你需要多少你可以通过一定的方法从里面取多少,这时候内存里面就没有那些准备就绪的元素了,相比之下是不是节约了成本呢?


  So , talk is cheap,I will show you my code

  First ,How can we creat generator?

  We have two ways:

  1.通过列表生成式

a = ( i for i in range(1000))

   这里,我们的 a 就是一个生成器了

  2.通过函数(by function)

  

def range2(n):
    '''生成器'''
    count = 0
    while count < n:
        print("before",count)
        count += 1
        yield count
    return 'done'

   在函数中,只要我们有了yield之后,我们的函数便变成了生成器,是不是很神奇--


 

yield

  在上面我们使用函数生成了生成器之后,我们用到了一个叫yield的家伙,这家伙是干什么的呢?

  yield有两个作用:

    1.返回数据

    2.将函数冻结在这里,等待唤醒

  那么我们如何去唤醒yield呢,我们也有两种方法:

  1.利用next()

s = range2(3)
print(next(s))

   这里需要注意的是,我们每调用一次,生成器就产出一个。这种情况下,我们的生成器就可以从里面向外面一个一个传数据出来了

  2.send方法

s.send("stop")#唤醒yield并且能向里面传值

   通过send方法,我们可以向yield传一个值,然后继续唤醒它。但是在这里,我们在没有激活它之前,是不能用send的(暂时不确定)

  

两者的共同点:都会激活yield,并且运行,直到碰到下一个yield


 

补充几点:

  函数有了yield之后之后,函数名加()就变成了一个生成器

  在生成器中,return代表中止,直接会报错,其中报错会有return的值

  

 

posted @ 2018-08-31 21:00  Recklessz  阅读(203)  评论(0编辑  收藏  举报