Python基础知识-----生成器

一、生成器概念:

二、生成器创建:
方法1:将列表推导式的[]改成():
eg:
G = (i for i in range(100000000000))
print(‘生成器:’,G)
三、生成器与列表推导式的区别:
(1)列表推导式:[i for i in range(10)],
一次性直接全部输出,占用内存大
eg:
g=[i for i in range(10)]
print(g) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

(2)生成器:是生成元素的方式,列表中的元素是通过某种算法推算出来的,通过next函数调用并不断返回下一个值的对象
eg:
g=(i for i in range(10))
print(‘生成器:’,g )#<generator object at 0x000000000213FF68>
print(next(g)) #0
print(next(g)) #1
总结:生成器优点:
(1)不必创建完整的list,节省空间。
(2)代码写法更加人性化,一边循环一边计算的机制,从而得到下一个元素。
四、生成器的异常情况与解决异常:
#异常情况:StopIteration
eg:
G = (i for i in range(1,10,2))
for i in range(6):
print(next(G))
#解决异常:
生成器本身是可迭代的,所以可以应用在for循环中
eg:
for i in G:
print(i)
#这种迭代输出的好处:不用考虑异常。
不好的地方:需要考虑中断循环操作,否则将把所有元素全部输出
五、生成器与函数:
假如你要实现更复杂的生成器功能,通过列表推导式这种方式是不能满足,所以就需要用函数

例如:生成斐波那契数列

#0,1,1,2,3,5,8,13…
def fib(times):
n = 0
a,b = 0,1
while n<times:
yield b #通过yield使函数变成一个生成器对象
a,b = b,a+b
n+=1

fib(100)
遇到元素太多,占用内存
这个时候使用生成器就可以很好的解决上述问题
F = fib(100)
print(F) #<generator object fib at 0x0000000002177BA0>
for i in range(5):
print(next(F))

注:yield的作用:
返回+中断:遇到yield自动挂起,并记住位置,保存上下文

六、总结
生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。
对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。
而且记录了程序执行的上下文。
生成器不仅“记住”了它的数据状态,生成还记住了程序执行的位置。
特点:
1.节约内存。
2.迭代到一一下的调用时,所使用的参数都是上一次所保留下来的,而不是新创建的。

猜你喜欢

转载自blog.csdn.net/charuiyu/article/details/86515881