0Pricing
Python Academy · 课时

生成器表达式

使用生成器表达式构建惰性序列,提高内存使用效率。

生成器表达式 是 CoddyKit 上的免费 Python Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。

简介

生成器表达式是惰性推导式:它们一次生成一个值,而不会在内存中创建列表。

生成器表达式语法

(expression for item in iterable) 使用圆括号。它返回生成器对象,而不是列表。
gen = (x**2 for x in range(5))
print(gen)  # generator object
print(next(gen))  # 0
print(next(gen))  # 1

内存效率

生成器一次只保存一个值。sum(x**2 for x in range(10**7)) 使用 O(1) 内存,而列表会占用更多内存。
total = sum(x**2 for x in range(100))
print(total)

消耗生成器

生成器只能消耗一次。耗尽后会引发 StopIteration,并且不再有剩余值。
gen = (x for x in range(3))
for val in gen:
    print(val)
# gen is now exhausted

将生成器作为函数参数

如果生成器是唯一的参数,可以省略额外的圆括号:sum(x**2 for x in range(10))。
print(sum(x**2 for x in range(10)))
print(max(len(w) for w in ['cat', 'elephant', 'ant']))

链接生成器

您可以惰性地链接生成器:evens = (x for x in range(100) if x%2==0); big = (x for x in evens if x>50)。
evens = (x for x in range(100) if x % 2 == 0)
big_evens = (x for x in evens if x > 50)
print(list(big_evens))

转换为列表或元组

list(gen) 或 tuple(gen) 会将所有值具体化。当需要随机访问或多次遍历时,请使用这种方式。
gen = (x**2 for x in range(5))
print(list(gen))

生成器表达式与列表推导式

以下情况使用生成器:只需遍历一次,或数据集很大。以下情况使用列表:需要 len()、索引或多次遍历。
import sys
lst = [x**2 for x in range(1000)]
gen = (x**2 for x in range(1000))
print(sys.getsizeof(lst), sys.getsizeof(gen))

无限生成器

itertools.count(0) 是一个无限计数器。将它与 islice 配合使用,只获取所需的值。
import itertools
first10 = list(itertools.islice(itertools.count(0), 10))
print(first10)

生成器与 any() 和 all()

any(x>5 for x in lst) 会短路,在第一个 True 处停止。all() 会在第一个 False 处停止。效率非常高。
nums = [1, 3, 7, 2]
print(any(x > 5 for x in nums))
print(all(x > 0 for x in nums))

流水线

以惰性方式链接转换:数据 → 筛选 → 转换 → 聚合。每一步都是生成器,只有在需要时才会执行。
data = range(1000)
filtered = (x for x in data if x % 7 == 0)
transformed = (x * 2 for x in filtered)
print(sum(transformed))

快速检查

与列表推导式相比,生成器表达式在内存方面的主要优势是什么?

回顾

生成器表达式:(expr for x in it)。惰性求值,使用 O(1) 内存。只能消耗一次。与 sum/any/all/max 一起使用。当需要多次遍历时,将其转换为列表。

继续学习

太棒了!请继续下一课,以进一步提升您的技能。

常见问题解答

「生成器表达式」课时是免费的吗?

是的 — 「生成器表达式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 列表推导式
  2. 集合与字典推导式
  3. 生成器表达式
  4. yield 关键字
← 返回 Python Academy