python中的生成器,边循环边计算,节省内存
第一种创建生成器的方法:只要把一个列表生成式的 [ ] 改成 ( )
l = [x*2 for x in range(5) ]
print(l)
g = (x*2 for x in range(5))
print(g)
print(next(g))
第二种方法:函数方式
def fib(n):
a,b = 0,1
i = 0
while(i<n):
a,b = b,a+b
#print(a)
yield a
i += 1
if __name__ == "__main__":
g = fib(5)
print(g)
#for temp in g:
# print(temp)
while True:
try:
print(next(g))
except StopIteration as e:
print("%s"%e)
break
yield的执行流程
g = fib(5)这行代码只是生成了一个生成器,并没有把所有的结果计算出来。只有在迭代这个生成器的时候,才会计算每次的结果。第一次迭代,执行到yield时,程序会暂停,然后返回这次生成器的结果输出;之后,继续执行程序,继续第二次迭代,再次到yield时,程序再次暂停,输出此次生成器结果;再继续第三次迭代。。。再到yield。。再输出结果。。继续下一次迭代
生成器的特点
节约内存
迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的