python生成器

有个需求,把列表[0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每一个值加1。python

什么是生成器?算法

 经过列表生成式,咱们能够直接建立一个列表,可是受到内存的限制,列表容量是有限的,并且建立一个包含100万个元素的列表,不只占用很大的存储空间,若是咱们仅仅须要访问前面几个元素,那后面绝大多数元素占用的空间都浪费了。数组

 因此,若是列表元素能够按照某种算法推算出来,那咱们是否可用在循环过程当中不断推算出后续的元素呢?这样没必要建立完整的list,从而节省大量的空间,在python中,这种一边循环一边计算的机制,成为生成器generator函数

 生成器是一种特殊程序,可用被用做控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可用使用next()函数和send()函数恢复生成器。spa

 生成器累死于返回值为数组的一个函数这个函数可用接收参数,能够被调用,可是,不一样于通常的函数会一次性返回包含了全部数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减小,并且容许调用函数可用很快的处理前几个返回值,所以生成器看起来像是一个函数,可是表现的却像是迭代器。内存

 

建立generator有不少种方法,其中一种很简单,只要把一个列表生成式的[]改为()便可,就建立了一个generatorgenerator

a=[0,1,2,3,4,5,6,7,8,9]
result=[i+1 for i in a ]
print(result) #列表生成式

generator_ex=(i+1 for i in a )
print(generator_ex) #生成器 <generator object <genexpr> at 0x0000023904A99258>

list和generator_ex的区别是:从表面看是[]和(),但结果却不同,一个打印出来是列表(由于是列表生成式),而第二个打印出来是
<generator object <genexpr> at 0x0000023904A99258>,若是须要打印出generator—_ex的每个元素,那么可使用next()函数
#若是要一个个打印出来,能够经过next()函数得到generator的下一个返回值:
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
相关文章
相关标签/搜索