生成器
01.生成器(generator)指生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象。
- 生成器表达式的格式为:
(返回值 for 元素 in 可迭代对象 if 条件)
- 生成器的特性包括:
- 生成器对象是一个可迭代对象,也是一个迭代器。
- 生成器对象是延迟计算、惰性求值的。
- 生成器对象无法使用计算长度。
- 生成器表达式的示例:
result = ((i+1)**2 for i in range(10))
for i in range(10):
print(next(result))
- 生成器对象一旦迭代完毕,不可回头;如果需要重新迭代,则必须重新生成一个生成器对象。
- 生成器函数的示例:
def inc():
for i in range(10):
yield i
result = inc()
for i in range(10):
print(i)
02.生成器对象的原理:
- 生成器对象的原理:
- 包含yield语句的生成器函数生成生成器对象时,生成器函数的函数体不会立即执行。
- next(生成器)会从函数的当前位置向后执行到碰到的第一个yield语句为止,并返回yield的值,并暂停函数。
- 再次调用next(生成器),和上一条一样的处理过程。
- 执行next()函数时,遇到return直接抛出异StopIteration异常。
- return语句在生成器函数中依然可以种植函数运行,但return语句的返回值不能被获取到。
- 生成器函数没有显式的return语句时,如果执行到结尾,一样会抛出StopIteration异常。
- 生成器的应用范围:
- 协程(coroutine):
- 创建2个生成器a和b。
- next(a)之后,a执行到了yield语句暂停,然后去执行next(b),b执行到了yield语句也暂停,然后再条用next(a),周而复始,实现了调度的效果。
- 协程(coroutine):
- 生成器对象的示例:
def inc():
def counter():
i = 0
while True:
i += 1
yield i
c = counter()
return lambda: next(c)
result = inc()
print(result())
03.yield from:
- yield from表示通过一个可迭代对象生成生成器。
- yield from iterable是for item in iterable: yield item形式的语法糖。
- yield from是python3.3出现的新的语法。
- yield from的示例:
def inc():
yield from range(100)
result = inc()
for i in range(100):
print(next(result))
文档更新时间: 2020-09-20 17:19 作者:闻骏