zoukankan      html  css  js  c++  java
  • python之生成器yeild

    python生成器Generator——yield

    思考:

    首先思考这样一个问题:

    创建一个列表,但是内存受限,容量一定是有限的。那么如果创建了一个包含100万个元素的列表,不仅占用很大的存储空间,而我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了?

    这个时候就需要一个容器,在我们需要数据的时候拿出来,不取数据的时候就释放掉。这样就能够节省资源和空间。

    yield的作用:

      把一个函数变成一个生成器,起到一个延迟的作用,在需要的时候产生结果,节省资源。与声明一个序列相比,生成器在不使用的时候不占用内存。

    1、首先实现一个功能,创建一个列表,然后挨个取出其中的元素。

    def getNum(n):
        i = 0
        while i < n:
            print(i)
            i += 1
    getNum(5)

    2、在这个基础上添加一个功能,每次调用这个函数都要返回一个值。

     但是加入return之后整个函数就退出了,下次再使用这个需要需要从头开始,那能不能实现接着上次停掉的地方开始呢?

    def getNum(n):
        i = 0
        while i < n:
            return i
            i += 1
    a = getNum(5)
    print(a)

     3、yeild。如果暂时想不明白,就把它看成return,但与return不同的是返回一个值并不会退出函数,而是停在这,直到下次被唤醒。

    yield与return返回相同的值,区别在于return返回后,函数状态终止,而yield会保存当前函数的执行状态,再次调用时,函数又回到之前保存的状态继续执行。

     但是,如果直接print,发现返回的是一个内存地址。并不是我们想象的那个东西。

    此时,对应于生成器的使用有一个专门的关键字next,就是相当于告诉生成器往下走一步。直至结束

    def getNum(n):
        i = 0
        while i < n:
            yield i
            i += 1
    a = getNum(5)
    print(a)
    ##调用生成器的两种方式
    print(next(a))
    print(a.__next__)

    最后,那么这个生成器有什么用呢?加入你有100万张图像,而每次你都只取n张,下次再取的时候接着刚刚的序列继续取。

     那么它是如何实现节省内存的呢?只记住当前位置,生成器只保留一个值,next之后上一个值就没有了,这就是为什么它能接着上次停止的位置继续下去!

  • 相关阅读:
    c++,不能声明为虚函数的函数
    Abstract
    多态性vptrvtable
    C++的重写,重载,重定义
    final
    scanf()和getchar() 使用
    深入理解C++中的mutable关键字
    equal和==
    MoQ(基于.net3.5,c#3.0的mock框架)简单介绍
    VS2008快捷键
  • 原文地址:https://www.cnblogs.com/zhangkanghui/p/11198552.html
Copyright © 2011-2022 走看看