python生成器,迭代器学习总结(由浅入深理解)

一.生成器

1.列表生成式生成器

介绍生成器之前我们要知道什么是列表生成式

如图
python生成器,迭代器学习总结(由浅入深理解)
我们用一行代码,就生成了这样的列表,这就是列表生成式。其实就是一种简化代码的写法。

同样,上面 i*2 比较简单,我们也可以用函数来生成列表
python生成器,迭代器学习总结(由浅入深理解)

到这里,进入正题→生成器。
把上面列表生成式的 [] 换成小括号 () ,这就是一个生成器(generator)了。
python生成器,迭代器学习总结(由浅入深理解)
生成器:只有在调用的时候才会产生相应的数据
(相对于列表,节省内存空间列表是提前把所有数据准备好了

生成器只有一个 next()方法 可以访问下一个元素(用的多的还是for循环)
python生成器,迭代器学习总结(由浅入深理解)
生成器只记录当前位置的数据,之前访问过的没有保存,不能访问之前访问过的数据

2.yield生成器
有的我们用列表生成式写不出来的,我们可以用函数来实现生成器。如下图代码,生成斐波那契数列,把print(b)换成 yield b 这个函数就变成生成器了。
python生成器,迭代器学习总结(由浅入深理解)
看到函数中有yield 这个函数就是生成器。

总结一下:生成器最大的好处就是,在处理很庞大的数据量时效率提升十分明显,比如一亿个数,如果用列表的话,列表是提前把这一亿个数存好了,提前准备好了,然后访问你想访问的数,但存这一亿个数的时间可能很长可能得等好几分钟;但使用生成器可以基本做到立刻访问的效果。

使用生成器还可以实现单线程并发。比如经典的消费者,生产者的例子,有兴趣可以看下面代码。
python生成器,迭代器学习总结(由浅入深理解)
python生成器,迭代器学习总结(由浅入深理解)

二。迭代器

可迭代对象:
简单的说就是可以用于for循环的对象。
python生成器,迭代器学习总结(由浅入深理解)
迭代器:
python生成器,迭代器学习总结(由浅入深理解)
我们可以使用dir()查看支持的所有方法中是否含有next(),支持就是迭代器
python生成器,迭代器学习总结(由浅入深理解)
由上面我们可以知道,生成器一定是迭代器,因为生成器肯定有next方法

列表,元组等可迭代对象没有next方法,所以不是迭代器; 但是我们使用 iter() 可以把这些可迭代对象变成迭代器

如下图,把a这个列表变成迭代器,这时它就可以调用next()方法了。

python生成器,迭代器学习总结(由浅入深理解)
python生成器,迭代器学习总结(由浅入深理解)

小结:凡是可作用于next()函数的对象都是Iterator(迭代器)类型,它们表示一个惰性计算的序列。惰性计算就是需要返回下一个数据时才计算

f.readlines()是把文件的每一行作为一个元素,形成一个列表。本质是迭代器。很多底层的东西,比如for循环本质都是用了迭代器。

参考资料:总结了一下老男孩python学习视频中的讲解