与列表一次性地将数据全都加载到内存不同的是,生成器使用推断加载数据,每次只推断出一个对象,在数据量比较大时,可以节省内存。这篇文章简单总结下创建生成器的方法,并用举一个生成器在斐波那契应用的例子。
一、创建生成器以及访问的方法
1. map
iter1 = map(lambda x:x, [0,1,2])
2. ()
iter2 = (x for x in range(3))
3.使用yield
def iter3():
for i in range(3):
yield i
看下它们的类型:
iter1 type is: <class 'map'>
iter2 type is: <class 'generator'>
iter3() type is: <class 'generator'>
其中,map类型也是生成器类型。如何访问一个生成器?以iter1为例,有以下方法:
# 1.一个个访问
print(next(iter1))
# 2.使用for访问
for i in iter1:
print(i)
break
# 3.转化为列表访问
print(list(iter1))
输出:
0
1
[2]
二、生成器的应用
使用迭代法来求解斐波那契数列:
# 使用生成器构菲波那契数列,数列下标从1开始
def fib(n):
a,b,i = 0,1,0
while i<n:
yield b
a,b = b,a+b
i += 1
def get_fib(n):
# 此时fib(n)是一个生成器
gener = fib(n)
for i in range(n-1):
next(gener)
return next(gener)
print(get_fib(3))
refer:生成器