🐍Python 常用容器与迭代
迭代器生成器与yield
面试回答
常见问法
迭代器和生成器有什么区别?yield 做了什么?
回答
迭代器是实现了迭代协议的对象,核心是 __iter__() 和 __next__();生成器是一种特殊迭代器,通常由带 yield 的函数创建。
yield 会暂停函数执行,保存当前状态,下次继续从暂停处往下跑。
def gen():
yield 1
yield 2
yield 3
追问
- 为什么生成器更省内存
return和yield有什么区别for循环底层怎么消费迭代器
原理展开
普通函数执行完直接返回结果,生成器函数调用后不会立刻执行函数体,而是返回一个生成器对象。
g = gen()
print(next(g))
print(next(g))
生成器适合:
- 大数据流逐个处理
- 惰性计算
- 不想一次性把结果全放进内存
而迭代器更像统一协议。for x in obj 的本质是:
- 先拿到迭代器
- 不断调用
next() - 捕获
StopIteration结束
易错点
- 把可迭代对象和迭代器当成同一个概念
- 以为生成器只是“语法更短的列表”
- 不知道
yield会保留函数上下文状态