python之生成器(generator)
定义:按照某种算法,边循环边计算推算出一个列表中的所有元素;
优点:受内存限制,列表容量是有限的,通过生成器,可以不断按算法推算出后续的元素,而不是把list的所有元素储存在内存中,从而实现内存的节约;
创建一个生成器:
1、把列表生成式[ ] 改成()
例:
l = [x ** 2 for x in range(10)] print(l) g = (x ** 2 for x in range(10)) print(type(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] <class 'generator'> 0 1 4 9 16
上面代码中l的类型是一个list,而g是一个generator;我们可以直接通过print(l)打印出列表中的所有元素,但要打印generator类型的可以通过next( )函数来获得下一个返回值,但generator也是一个可迭代对象,是可迭代对象就可以通过for循环来遍历。
l = [x ** 2 for x in range(10)] print(l) g = (x ** 2 for x in range(10))
print(type(g))
for i in g :
print(i)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] <class 'generator'> 0 1 4 9 16 25 36 49 64 81
当然基于复杂的推算,用列表生成式无法实现可以用函数来实现,定义generator的另一种方式:一个函数中包含yield关键字,那么这个函数就不在是一个普通函数,它是一个generator,如下图所示:
def func (n): i,a =0,1 while i < n : print(a) a = a+2 i += 1 def func_y (n): i,a =0,1 while i < n : yield a a = a+2 i += 1 if __name__ =='__main__': d = func_y(10) for i in d : print(i)
1 3 5 7 9 11 13 15 17 19
上图中函数func( )与func_y( )唯一的不同就是func( )函数中的print(a)变成了func_y( )中的yield a,func_y( )是一个生成器,那么就是一个可迭代对象,可以通过for来循环print(i)。所以在python中,可以很简单的把列表生成式的[ ]改成( )来改成generator,也可以通过更改函数中yield关键字来实现定义一个generator。

浙公网安备 33010602011771号