典型代码:
def mygen():
i = 0
while i < 100:
yield i
i += 1
if __name__ == '__main__':
gen = mygen()
for item in gen:
print(item)
什么是生成器:
生成器是一个包含yield表达式的函数,只要一个函数中有了yield表达式,当调用这个函数的时候,函数体的代码压根就不会执行,它只是会返回一个生成器对象。如果访问一个生成器迭代器,每次访问到的值都是动态生成的(比如典型代码中的变量i),即是yield右边的值,并冻结当前状态,等待下一次访问。对于生成器对象可以将其理解为一种值的顺序生成规则的描述,生成器对象会一直维护自己的生成规则上下文,直到结束(当然,也可以不结束)。
应用场景:
如果需求是动态的生成一个列表,然后其它函数会一次性访问这个列表中的项,做相应的处理工作。
带来的好处:
1. 不必返回整个列表对象,只返回生成规则描述,如果元素数量较大,可以节省大量内存。生成器甚至可以生成一个无限序列,只要生成规则永不停止即可。
2. 逻辑清晰,一眼就能看到值是如何返回的。
注意的点:
生成器对象是有状态的,只能访问一次。这也很容易理解,因为生成器只是一个值的生成规则,加上其上下文,不像列表一样保存了所有的值。
也可以使用原生的迭代器协议访问生成器,但是需要手动处理迭代器结束时的StopIteration异常:
gen = mygen()
while True:
try:
data = next(gen)
print(data)
except StopIteration:
print('Iteration done')
break