生成器


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),周而复始,实现了调度的效果。
  • 生成器对象的示例:
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   作者:闻骏