Skip to main content

迭代器与生成器

可迭代与迭代器

  • 可迭代(iterable):能用于 for ... in,实现了 __iter__(返回一个迭代器)
  • 迭代器(iterator):同时实现 __next__(产出下一个值)和 __iter__(通常返回自身)

可迭代不一定是迭代器;iter(x) 会从可迭代对象得到迭代器。迭代器耗尽后不能重复遍历。

it = iter([10, 20])
print(next(it)) # 10
print(next(it)) # 20
print(iter(it) is it) # True:迭代器的 __iter__ 返回自身

生成器函数(yield)

def countdown(n):
while n > 0:
yield n
n -= 1

for x in countdown(3):
print(x) # 3 2 1

调用生成器函数不会立刻跑完,返回的是生成器对象;每次迭代推进到下一个 yield

生成器表达式

gen = (x * x for x in range(5))
print(sum(gen))

与列表推导式类似,但惰性、不一次建完整个列表。

为何有用

处理大文件/大序列时,生成器能省内存:边读边处理,而不是一次性 read() 全部。

要点

  1. for 底层就是迭代器协议
  2. yield 把函数变成生成器
  3. 需要「惰性」时用生成器,需要「多次随机访问」时用列表