有个需求,把列表[0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每个值加1。
什么是生成器?
通过列表生成式,我们可以直接创建一个列表,但是受到内存的限制,列表容量是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可用在循环过程中不断推算出后续的元素呢?这样不必创建完整的list,从而节省大量的空间,在python中,这种一边循环一边计算的机制,成为生成器generator
生成器是一种特殊程序,可用被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可用使用next()函数和send()函数恢复生成器。
生成器累死于返回值为数组的一个函数这个函数可用接收参数,可以被调用,但是,不同于一般的函数会一次性返回包含了所有数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减少,而且允许调用函数可用很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现的却像是迭代器。
创建generator有很多种方法,其中一种很简单,只要把一个列表生成式的[]改成()即可,就创建了一个generator
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))