🐍Python 常用容器与迭代

迭代器生成器与yield

面试回答

常见问法

迭代器和生成器有什么区别?yield 做了什么?

回答

迭代器是实现了迭代协议的对象,核心是 __iter__()__next__();生成器是一种特殊迭代器,通常由带 yield 的函数创建。

yield 会暂停函数执行,保存当前状态,下次继续从暂停处往下跑。

def gen():
    yield 1
    yield 2
    yield 3

追问

  • 为什么生成器更省内存
  • returnyield 有什么区别
  • for 循环底层怎么消费迭代器

原理展开

普通函数执行完直接返回结果,生成器函数调用后不会立刻执行函数体,而是返回一个生成器对象。

g = gen()
print(next(g))
print(next(g))

生成器适合:

  • 大数据流逐个处理
  • 惰性计算
  • 不想一次性把结果全放进内存

而迭代器更像统一协议。for x in obj 的本质是:

  1. 先拿到迭代器
  2. 不断调用 next()
  3. 捕获 StopIteration 结束

易错点

  • 把可迭代对象和迭代器当成同一个概念
  • 以为生成器只是“语法更短的列表”
  • 不知道 yield 会保留函数上下文状态