1. 生成器 Generator
前面有列表解析式,集合解析式,字典解析式,唯独没有元组解析式,这是因为元组的小括号 ( ) ,被用来做生成器了。
1.1 生成器表达式 Generator Expression
( 返回值 for 元素 in 可迭代对象 if 条件 )
通过生成器表达式,我们就创建了一个生成器,所说的生成器,就是不断地生产出我们需要的数据。
但是要注意,生成器里面储存的是所需数据的算法,而不是数据:
g = (i for i in range(5))
g
<generator object <genexpr> at 0x00000214B0EFFE08>
#生成器对象,genexpr里面是generator expression的缩写,后面at是指出存在哪里
1.2 用生成器获取数据
如果需要生成器计算出一个数据并返回,需要手动操作并返回,此时需要一个next()函数。
next(g)
0
next(g)
1
....
next(g)
4
next(g)
#会报错,StopIteration
我们创建的这个生成器g,只能使用5次,之后再使用就会报错stopiteration,就是说迭代停止了,这说明什么?
说明一个生成器只能依次生产数据,如果内部算法可以得出的数据都生产完了,那么这个生成器就结束了他的使命,要想再次使用,得重新定义,也就是重新做一个生成器。
如果需要生成器生成全部的数据,需要用for循环来迭代,因为生成器都是迭代器iterator,但是一定要注意,迭代器不一定是生成器。
g = (i for i in range(5))
for i in g:
print(i)
#迭代一遍这个生成器,此时它作为一个迭代器,行驶的是迭代器的功能,打印生产出的数据。
print('........................') #分隔一下
for i in g:
print(i+1) #想再迭代一遍这个生成器(迭代器),打印i+1
0
1
2
3
4
........................
可以看出,这个生成器只能使用一次,一旦算法没有数据可以生产了,就停止。