python生成器Generator——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之后上一个值就没有了,这就是为什么它能接着上次停止的位置继续下去!