思考:python
首先思考这样一个问题:函数
建立一个列表,可是内存受限,容量必定是有限的。那么若是建立了一个包含100万个元素的列表,不只占用很大的存储空间,而咱们仅仅须要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了?spa
这个时候就须要一个容器,在咱们须要数据的时候拿出来,不取数据的时候就释放掉。这样就可以节省资源和空间。code
yield的做用:blog
把一个函数变成一个生成器,起到一个延迟的做用,在须要的时候产生结果,节省资源。与声明一个序列相比,生成器在不使用的时候不占用内存。内存
一、首先实现一个功能,建立一个列表,而后挨个取出其中的元素。资源
def getNum(n): i = 0 while i < n: print(i) i += 1 getNum(5)
二、在这个基础上添加一个功能,每次调用这个函数都要返回一个值。get
可是加入return以后整个函数就退出了,下次再使用这个须要须要从头开始,那能不能实现接着上次停掉的地方开始呢?class
def getNum(n): i = 0 while i < n: return i i += 1 a = getNum(5)
print(a)
三、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以后上一个值就没有了,这就是为何它能接着上次中止的位置继续下去!