python生成器
作者:向前的步伐 / 发表: 2019年6月16日 19:48 / 更新: 2019年6月16日 20:27 / python / 阅读量:720
在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, ',')