迭代器、生成器

2018-08-02 分类:Python 阅读(311) 评论(0)

迭代器只有在调用next的时候才会取数据(所以省内存),或者循环的时候,一个对象里面实现了__iter__方法,iter方法里面返回了一个迭代器,那就是一个可迭代对象了。

下面的代码,首先实现了iter方法,这个对象就是一个可迭代对象了,然后又返回了self就是自己,就是一个迭代器了。

使用for 循环的时候会自动调用__next__方法取到返回值,直到抛出StopIteration异常就停止了。

迭代器实现起来比较复杂,必须得写一个类,逻辑不清楚。

生成器的出现,就是为了简化创建迭代器的繁杂,同时又要保证逻辑的清晰,说到底生成器就是为了更方便我们使用迭代器而生的,生成器的特性如下:

1 生成器的样子就是一个普通的函数,只不过return关键词被yield取代了
2 当调用这个“函数”的时候,它会立即返回一个迭代器,而不立即执行函数内容,直到调用其返回迭代器的next方法是才开始执行,直到遇到yield语句暂停。
3 继续调用生成器返回的迭代器的next方法,恢复函数执行,直到再次遇到yield语句
4 如此反复,一直到遇到StopIteration

看下面的生成器,逻辑就很清晰了,只是把原来的return变成了yield

用生成器和迭代器的好处就是节省内存,比如说一个list里面有10000个元素,那他就会占这么多的内存,如果用了迭代器,它是需要用到这个值的时候才去计算出来,存到内存里面,占用内存特别少。

当然生成器还有更高级的用法,python的协程就是通过生成器来实现的,因为函数里面遇到yield就会暂停这个函数的运行,下次在调用next方法的时候,或者下次循环的时候才会继续从yield下面继续往下走,过程如下图

那我们是不是可以想,在这个函数暂停的时候可以让他做点其他的事情呢,比如说在下载东西的时候,就得等待了,就yield一下,切换到别的东西去执行,什么时候执行完了再回来。这个就是异步io的原理了,python里面的协程就是基于yield实现的。

协程和异步io的原理请下面三篇文章

https://juejin.im/post/5b3c4b9e6fb9a04f8d6b94de

https://juejin.im/post/5b3f540af265da0f742ec5e1

https://juejin.im/post/5b42e404e51d4519873f1a1b

 

您可能也喜欢:

协程、gevent实现异步io、进程、线程、协程对比

异步io的说白了就是遇到io操作的时候,就停下来去做别的事情。io分网络io和磁盘io,网络io比如说打开一个网站获取数据,下载一首歌等等,磁盘io就是把数据存到一个文件里面,写到磁盘上。 从网站上获取数据或者把数据写到磁盘上都是需要时间的,那就得等待了,这样的话,很多任务的时候就比较慢了,而异步i...

more

socket、tcp/ip协议、udp协议

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,...

more

设计模式之单例模式

什么是设计模式,我们写代码就是为了解决一些实际的问题,当然在我们之前已经有很多优秀的程序员写了很多的代码,总结出来了某一类问题成熟的解决方案,我们拿来用就可以了。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的...

more

评论&留言
欢迎新朋友你的到来!
还没有人抢沙发呢~
昵称

登录

忘记密码 ?

切换登录

注册