在聊生成器之前 ,我们先看看什么是生成式?
a = [i*2 for i in range(10) ] 类似于这样的就是生成式
而把列表 “ [ ] ” 符号换成 " () " 则就称为 generator 类型
什么是生成器?
在 Python 中,使用了 yield 的函数被称为生成器。
跟普通函数不同的是,生成器是一个返回迭代器的函数 ,只能用于迭代操作,更简单点理解生成器就是一个迭代器 。
生成器的特点:
1).只有在调用时才会生成相应的数据
2).只记录当前位置
3).只有一个__next__() 方法。在python2.7中是 next()
下面我们用斐波那契数列,写一个生成器:
那么我们为什么要用生成器 ,它的优点是什么呢?
由于生成器只有在调用时,才会生成数据,所以它可以节省内存占用。而且生成器可在单线程下实现并发运算处理效果 ,这点很牛逼 。
以下是并行效果代码演示:
接下来我们来看看什么是迭代器?
我们知道 ,可以直接作用于for 循环的数据类型有以下几种:
一类是集合数据类型,如 list 、tuple、dict、set 、str 等;
一类是generator,包括生成器和带yield的generator function。
我们把这些可以直接作用于for循环的对象统称为可迭代对象:Iterable 。
像生成器这样 ,不但可以作用于for循环,还可以被next() 函数不断调用并返回下一个值,
直到最后抛出StopIteration 错误表示无法继续返回下一个值了 。我们把这种可以被next()函数
调用并不断返回下一个值的对象称为迭代器:Iterator。
由此可见 ,我们可以知道,生成器肯定是一个迭代器,但迭代器不一定是生成器。
当然我们也可以使用 iter() 函数 ,把可迭代对象(Iterable)变成迭代器(Iterator)
小结:
凡是可作用于for 循环的对象都是 Iterable 类型;
凡是可作用于next() 函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list 、dict、str等是Iterable但不是Iterator,不过可以通过iter() 函数获得一个 Iterator 对象 。
文章来源于网络 ,如有侵权请联系站长QQ61910465删除
本文版权归去快排Seo www.SEOgurublog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ▷61910465