6.2.8. 生成器表达式
生成器表达式是用圆括号括起来的紧凑形式生成器标注。
- generator_expression ::= "("
expression
comp_for
")"
生成器表达式会产生一个新的生成器对象。 其句法与推导式相同,区别在于它是用圆括号而不是用方括号或花括号括起来的。
在生成器表达式中使用的变量会在为生成器对象调用 __next__()
方法的时候以惰性方式被求值(即与普通生成器相同的方式)。 但是,最左侧 for
子句内的可迭代对象是会被立即求值的,因此它所造成的错误会在生成器表达式被定义时被检测到,而不是在获取第一个值时才出错。 后续的 for
子句以及最左侧 for
子句内的任何筛选条件无法在外层作用域内被求值,因为它们可能会依赖于从最左侧可迭代对象获取的值。 例如: (x*y for x in range(10) for y in range(x, x+10))
.
圆括号在只附带一个参数的调用中可以被省略。 详情参见 调用 一节。
为了避免干扰到生成器表达式本身的预期操作,禁止在隐式定义的生成器中使用 yield
和 yield from
表达式。
如果生成器表达式包含 async for
子句或 await
表达式,则称为 异步生成器表达式。 异步生成器表达式会返回一个新的异步生成器对象,此对象属于异步迭代器 (参见 异步迭代器)。
3.6 新版功能: 引入了异步生成器表达式。
在 3.7 版更改: 在 Python 3.7 之前,异步生成器表达式只能在 async def
协和中出现。 从 3.7 开始,任何函数都可以使用异步生成器表达式。
在 3.8 版更改: yield
和 yield from
在隐式嵌套的作用域中已被禁用。