【Python】迭代器和生成器-asyncio01

151 阅读2分钟

什么是迭代器?

在Python中,能跟在for循环in后面的都是可迭代对象,他们都能生成迭代器

可迭代对象实现了__iter__方法,返回一个迭代器

迭代器实现了__iter__方法和__next__方法

  • 调用iter()方法返回self即可
  • 调用next()方法获取迭代器的下一个返回

在迭代结束后,再调用next方法会抛出StopIteration异常

迭代器的作用

  1. 统一通过next()方法获取数据,屏蔽了底层数据读取方式不一致
  2. 容器类只关心存储,每一次迭代又迭代器维护迭代过程和状态

什么是生成器?

在Python的函数中只要有yield关键字的函数就是生成器函数,它的返回值不再是return的值而是返回一个generator

生成器函数中,遇到yield返回yield后面的值,遇到return或函数结束抛出StopIteration异常,return的结果保存在异常信息中

生成器底层原理

Python运行时有一个栈,函数调用会有一个frame对象入栈,保存当前函数的调用情况在code对象中__code__,比如代码执行的行数、局部变量和全局变量的值等等

  • 普通函数的运行栈就是一个frame一个引用 创建:构建frame对象入栈 结束:frame对象出栈并销毁
  • 生成器函数自身带有一个frame,这个很重要,说明了生成器自己能记得上次运行的状态 创建:构建frame对象 next方法:frame入栈 yield方法:frame出栈(保留) 迭代结束:出栈销毁frame

基于生成器的简陋协程

image.png

image.png

send和close方法

  • send方法可以接受一个入参,将参数传递到yield中,第一次要预激
  • close方法可以结束迭代