Python进阶——生成器
什么是生成器?
元素可以按照某种算法推算出来,以此得到下一个元素,不必得到全部的元素后再进行输出,既可以边迭代边输出的机制。
生成器的核心特性?
边迭代边输出或者边循环边计算
那么为什么要有生成器呢?
在使用列表等结构时,数据已经事先加载在内存中了,如果此时的列表中数据量很大的话,计算机内存资源会非常吃惊,甚至内存溢出,比如我们加载了一个含有一亿个元素的列表,而只需要获取他的前十个,就算能将这一亿的数据装入列表,后面的元素占用的空间也都是浪费了(我们只用前十个)。
如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的列表,从而节省大量的空间。
☝️ tips:又想要使用大量数据,又想让它占用空间少,那就使用生成器!
怎么创建生成器呢?
-
最简单的方法和之前的列表推导式类似只是将
[]
换成了()
:# 生成器就这么得到了 generator = (num for num in range(1,5)) print(generator) # <generator object <genexpr> at 0x000001C7C9E3FD48>
-
或者使用
yield
关键字如果一个函数中包含
yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator
生成器的使用:斐波那契数列
- 不使用生成器
def fibonacci(n):
a, b = 0, 1
result = []
count = 0
while True:
if count > n:
break
result.append(a+b)
a, b = b, a+b
count += 1
return result
print(fibonacci(10))
# print(fibonacci(1000000000)) # 可以试试这个,超内存,跑不动
- 使用生成器
def fibonacci(n):
a, b = 0, 1
count = 0
while True:
if count > n:
continue
yield a+b
a, b = b, a+b
count += 1
generator = fibonacci(10000000) # 边迭代边输出
# 可以遍历全部
# for i in generator:
# print(i)
# 可以遍历部分
for i in generator:
if i < 100:
print(i)