个人博客

python生成器

在python中,我们可以使用列表存储数据,但是当我们数据量特别大的时候,一个列表存储所有的数据就占用了很大的内存,这个时候就可以使用生成器来完成数据列表的存储,而且还不占用内存。

生成器的元素是按照某种算法推导,只在下一次需要下个元素的时候,才去生成新的元素,这样的好处就是不必一次性生成所有的元素,节省大量的存储空间。

我们应该常使用过列表推导式生成一个列表:

list1 = [x for x in range(10)]

我们可以使用类似的方式,简单的创建一个生成器,直接把列表推导式的[]换为():

gen1 = (x for x in range(10))

我们也可以使用生成器函数,在函数的内部使用yield关键字。只要函数内部使用了yield,则这个函数不再是普通函数,而是一个生成器。在这种方式下,生成器可以实现无限制的列表元素,而列表推导式就无法做到。

def test():
    i = 0
    while i < 5:
        data = yield i
        print(data)
        i += 1
gen = test()

生成器能够迭代的关键是它有一个next()方法,原理就是通过不断地调用next()方法,直到抛出一个异常。

虽然可以使用next()来获取下个元素的值,但是这种方式遇到结束时,一般都是抛出异常,需要程序员自己捕获异常处理,使用起来不太方便。一般都是使用for循环来遍历,整个生成器,而且结束时也不需要自己处理异常。

yield相当于return一个值,并且记住该位置,下次迭代时,代码从yield的下一条语句开始执行。

生成器还可以使用send()让生成器继续走下一步,结果和next()一样,但send()可以传递一个值给到生成器,这个值作为yield表达式整体的结果。

可以看下面的简单的例子:

def yield_func(n):
    for i in range(10):
        yield call(i)
        print('i=', i)
    print('Done')

def call(i):
    return i * i

for i in yield_func(5):
    print(i, ',')
相关标签
回到顶部