说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的生成器表达式是用圆括号括起来的紧凑形式生成器标注。生成器表达式产生一个新的生成器对象。它的语法与推导式相同,只是用括号而不是括号或花括号括起来。
我们生成器表达式定义一个偶数生成器:
ge = (i for i in range(2, 1000000) if i%2==0)
ge
# <generator object <genexpr> at 0x7f8bde6e0660>
type(ge)
# generator
next(ge) # 2
next(ge) # 4
next(ge) # 6
# ...
# 可以在函数的传参中
max(i for i in range(10))
# 9
关于生成器类型可以查看:Python 生成器类型。
语法为:
(expr for iter_var in iterable if cond_expr)
当为生成器对象调用 __next__()
方法时(以与普通生成器相同的方式),生成器表达式中使用的变量会被延迟计算。但是,最左边的 for 子句中的可迭代表达式会立即被求值,因此由它产生的错误将在定义生成器表达式的地方发出,而不是在检索第一个值的地方发出。后续的 for 子句和最左边的 for 子句中的任何过滤条件都不能在封闭范围内进行评估,因为它们可能取决于从最左边的可迭代对象中获得的值。
例如:
(x*y for x in range(10) for y in range(x, x+10))
圆括号在只附带一个参数的调用中可以被省略。
为了避免干扰到生成器表达式本身的预期操作,禁止在隐式定义的生成器中使用 yield 和 yield from
表达式。
如果生成器表达式包含 async for
子句或 await 表达式,则称为异步生成器表达式。异步生成器表达式返回一个新的异步生成器对象,它是一个异步迭代器。
例如:
import asyncio
async def numbers(numbers):
for i in range(numbers):
yield i
await asyncio.sleep(0.5)
gen = (i async for i in numbers(10) if i % 2)
gen
# <async_generator object <genexpr> at 0x7fd9585e37c0>
3.6 新版功能:引入了异步生成器表达式。
在 3.7 版更改:在 Python 3.7 之前,异步生成器表达式只能出现在 async def
协程中。从 3.7 开始,任何函数都可以使用异步生成器表达式。
在 3.8 版更改:在隐式嵌套范围内禁止 yield
和 yield from
。
与其他推导式对比如下:
更新时间:July 19, 2022, 8:29 a.m. 标签:python 生成器 表达式