生成器表达式
编写简洁的惰性处理流程
生成器表达式 是 CoddyKit 上的免费 Python Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
从列表推导式到生成器表达式
生成器表达式看起来像列表推导式,但使用圆括号而不是方括号。它会惰性地产生值,而不是构建完整列表。
list_comp = [x * x for x in range(5)]
gen_expr = (x * x for x in range(5))
print(list_comp)
print(gen_expr)
print(list(gen_expr))内存占用差异
列表推导式会预先分配每个元素。生成器表达式在您请求值之前几乎不占用内存。请比较它们的大小。
import sys
lst = [x for x in range(10000)]
gen = (x for x in range(10000))
print('list bytes:', sys.getsizeof(lst))
print('gen bytes:', sys.getsizeof(gen))遍历生成器表达式
您可以像使用任何迭代器一样消耗生成器表达式:使用 for 循环、next(),或将其传递给函数。
gen = (c.upper() for c in 'hello')
for ch in gen:
print(ch)使用 if 进行筛选
添加 if 子句,只保留符合条件的项目,就像在推导式中一样。
evens = (n for n in range(10) if n % 2 == 0)
print(list(evens))直接传递给函数
当生成器表达式是函数的唯一参数时,您可以省略多余的圆括号。这样写更简洁,也能避免构建临时列表。
total = sum(x * x for x in range(5))
print(total)
biggest = max(len(w) for w in ['a', 'abc', 'ab'])
print(biggest)只能使用一次的提醒
生成器表达式遍历一次后就会耗尽,就像生成器函数一样。第二次遍历不会生成任何值。
gen = (x for x in range(3))
print(list(gen))
print(list(gen))串联表达式
您可以将一个生成器表达式传递给另一个,以构建惰性流水线。在最终的消费者获取值之前,不会计算任何内容。
nums = (n for n in range(10))
evens = (n for n in nums if n % 2 == 0)
doubled = (n * 2 for n in evens)
print(list(doubled))any() 和 all()
生成器表达式与 any() 和 all() 搭配时非常高效,因为它们可以短路,一旦确定答案就会停止。
words = ['cat', 'dog', 'elephant']
print(any(len(w) > 5 for w in words))
print(all(len(w) >= 3 for w in words))嵌套循环
与推导式一样,生成器表达式支持多个 for 子句,并按照从左到右的顺序读取。
pairs = ((x, y) for x in range(2) for y in range(2))
print(list(pairs))惰性流水线示例
下面是一个小型文本处理流水线。每个阶段都是惰性的,因此即使文件非常大,也可以采用流式方式处理,而不必一次性全部加载。
lines = [' alpha ', '', ' beta', 'gamma ']
stripped = (line.strip() for line in lines)
nonempty = (line for line in stripped if line)
print(list(nonempty))如何选择
当您需要多次使用数据或需要通过索引访问数据时,请使用列表推导式。对于单次流式处理或大型数据,请使用生成器表达式。
data = range(6)
as_list = [x + 1 for x in data]
print(as_list[0], as_list[-1])
total = sum(x + 1 for x in data)
print(total)快速检查
检验您对生成器表达式的理解。
回顾
您学习了生成器表达式:
- 使用圆括号,获得列表推导式的惰性替代方案。
- 生成器表达式节省内存,并支持
if筛选和嵌套循环。 - 它们与
sum、any、all以及串联操作配合良好。 - 它们只能使用一次。
接下来:使用 yield from 组合生成器。
常见问题解答
「生成器表达式」课时是免费的吗?
是的 — 「生成器表达式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「生成器表达式」这节课中我会学到什么?
编写简洁的惰性处理流程 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「生成器表达式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 迭代器协议
- 生成器函数
- 生成器表达式
- yield from 与委托