如果要控制内存占用,最好不要用list来保存中间结果,而是通过iterable对象(range, xrange, generator等)来迭代。
yield 使函数变为generator,返回对象为iterator(可通过for循环遍历)
在一个generator function中,默认会执行到函数完毕,如果有return命令,编译时会直接报错。在同一个函数中,yield与return互斥
可通过yield控制文件读取。
yield利用实例fabonacci:
def fab(max):
n, a, b = 0, 0, 1
while n < max:
a, b = b, a+b
n += 1
yield b
>>> from inspect import isgeneratorfunction
>>> isgeneratorfunction(fab)
True
>>> import types
>>> isinstance(fab, types.GeneratorType)
False
>>> isinstance(fab(5), types.GeneratorType)
True
>>> from collections import Iterable
>>> isinstance(fab, Iterable)
False
>>> isinstance(fab(5), Iterable)
True
定义类的next方法,则根据类实例的当前变量,可通过next方法一直获取下一个值,在空间占用固定的情况下,可获得整个序列。
这也是generator的实现方式。
每次调用next方法时才会执行一次generator的代码。