1、生成器
生成器表达式:(i * i for i in range(8))
[i *i for i in range(8)] #列表推导式
[0, 1, 4, 9, 16, 25, 36, 49]
(i *i for i in range(8)) #生成器表达式
<generator object <genexpr> at 0x000001D3471DBD68>
1.1 生成器元素查看方式
查看生成器对应的所有元素,有两种方式:
- 1、多次调用内置函数next(),每次调用都返回生成器的下一个元素,直到抛出异常StopIteration时表示没有更多元素了。
a=(i*i for i in range(8))
print(next(a)) #0
print(next(a)) #1
print(next(a)) #2
print(next(a)) #3
print(next(a)) #4
print(next(a)) #5
print(next(a)) #6
print(next(a)) #7
print(next(a)) #StopIteration
###################### 输出 ######################
0
1
4
9
16
25
36
49
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-6-7a6fe6cb648e> in <module>()
8 print(next(a))
9 print(next(a))
---> 10 print(next(a))
StopIteration:
- 2、使用for-in语句对生成器进行迭代,这样就不需要关心异常StopIteration了。
a = (i * i for i in range(8))
for j in a:
print(j)
###################### 输出 ######################
0
1
4
9
16
25
36
49
注意:生成器中保存的并不是其对应的所有元素,而是如何推算出所有元素的算法。
1.2 生成器是惰性推算
将生成器用于for-in语句时,元素是在循环的过程中不断被推算出来。将生成器作为内置函数next()的实参时,返回的下一个元素也是在调用函数时被推算出来。因此,生成器是惰性推算的,也就是说,只有当用到生成器中的每个元素时,才会临时进行推算,而并不会提前推算出来。
如果需要创建下一个元素较大的容器,就可以考虑使用生成器&