15 分钟
Python 进阶

生成器表达式

理解生成器表达式与列表推导式的区别

  • 理解生成器与列表的区别
  • 使用生成器表达式节省内存
  • 掌握 any/all 函数

生成器表达式

把列表推导式的 [] 换成 () 就是生成器表达式。它不立即创建列表,而是按需生成元素:

示例代码(可运行)
ℹ️什么时候用生成器

处理百万级这类大量数据时,生成器不占大量内存。但生成器只能遍历一次,需要索引或多次遍历时用列表。

any() 和 all()

示例代码(可运行)
预测输出
gen = (x for x in range(3))
print(list(gen))
print(list(gen))
找 Bug生成器不支持索引访问。
gen = (x for x in range(5)) print(gen[2])
填空题填写空白处的代码
nums = [2,4,6,8] print((n > 5 for n in nums)) # True
选择题

生成器表达式用什么括号?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

list 底层是一段连续的指针数组,容量不够时整体扩容(CPython 约按 1.125 倍)。因此按下标取元素是 O(1),末尾 append 均摊 O(1),但在头部 insert(0,…) 或 pop(0) 要搬动全部元素、是 O(n)。dict/set 基于哈希表,平均查找 O(1) 但更耗内存。选对数据结构,往往比抠语法更影响性能。

挑战任务

生成器挑战

简单+50 XP

直接用生成器表达式算1到1000里偶数的和,不用创建列表。

生成器挑战
2 个测试用例

课后作业

大文件处理

中等+20 XP

用生成器思路找1-10000里的所有素数,就用sum加生成器。

大文件处理
1 个测试用例