python3

在Python中,这种一边循环一边计算的机制,称为生成器:generator。

生成器保存的是算法,每次调用 next() ,就计算出 下一个元素的值,
直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的异常
当然,这种不断调用 next() 实在是太变态了,正确的方法是使用 for 循环,因为生成器也是可迭代对象。
所以,我们创建了一个生成器后,基本上永远不会调用 next() ,
而是通过 for 循环来迭代它,并且不需要关心 StopIteration 异常。

创建生成器的方法:
1、只要把一个列表生成时的[]改为()
2、定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator


用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中
while True:
try:
x = next(g)
print("value:%d"%x)
except StopIteration as e:
print("生成器返回值:%s"%e.value)
break

生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。
生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。
def gen():
i = 0
while i<5:
temp = yield i
print(temp)
i+=1

r = gen()
可以通过next(r)或者 r.__next__()方法获取下一个值


生成器的特点:
1、节约内存
2、迭代到下一次的调用时,所使用的参数都是第一次所保留下的,
即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的
原文地址:https://www.cnblogs.com/AndyChen2015/p/7410225.html