zoukankan      html  css  js  c++  java
  • 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的值

      

  • 相关阅读:
    spring cloud教程
    ideaaaaaaaaa
    Django
    Django 基础介绍
    Pychram
    python
    python
    python
    Python
    Python -- Scrapy 命令行工具(command line tools)
  • 原文地址:https://www.cnblogs.com/swearBM/p/9568249.html
Copyright © 2011-2022 走看看