什么是迭代器?
在Python中,能跟在for循环in后面的都是可迭代对象,他们都能生成迭代器
可迭代对象实现了__iter__方法,返回一个迭代器
迭代器实现了__iter__方法和__next__方法
- 调用iter()方法返回self即可
- 调用next()方法获取迭代器的下一个返回
在迭代结束后,再调用next方法会抛出StopIteration异常
迭代器的作用
- 统一通过next()方法获取数据,屏蔽了底层数据读取方式不一致
- 容器类只关心存储,每一次迭代又迭代器维护迭代过程和状态
什么是生成器?
在Python的函数中只要有yield关键字的函数就是生成器函数,它的返回值不再是return的值而是返回一个generator
生成器函数中,遇到yield返回yield后面的值,遇到return或函数结束抛出StopIteration异常,return的结果保存在异常信息中
生成器底层原理
Python运行时有一个栈,函数调用会有一个frame对象入栈,保存当前函数的调用情况在code对象中__code__,比如代码执行的行数、局部变量和全局变量的值等等
- 普通函数的运行栈就是一个frame一个引用 创建:构建frame对象入栈 结束:frame对象出栈并销毁
- 生成器函数自身带有一个frame,这个很重要,说明了生成器自己能记得上次运行的状态 创建:构建frame对象 next方法:frame入栈 yield方法:frame出栈(保留) 迭代结束:出栈销毁frame
基于生成器的简陋协程
send和close方法
- send方法可以接受一个入参,将参数传递到yield中,第一次要预激
- close方法可以结束迭代