小说python2和python3的差异一文中,
在说明range,xrange,map的差异时
提到Iterable
和Iterator
,有朋友反馈没留意过这两个东东,
这里就小说一把,认识一下
Iterable和Iterator
Iterable
: 可迭代对象
直接作用于for循环的对象统称为可迭代对象
如list
tuple
dict
set
str
等集合数据类型
还有Iterator
generator
map
等迭代器或是迭代器子类
Iterator
: 迭代器
![官方说明 官方说明](https://i.imgur.com/x9HbQV5.png)
被next()函数调用并不断返回下一个值的对象
本质上是实现了__iter__
,__next__
方法(python2是__iter__
,next
方法)
相互关系:
![](https://i.imgur.com/X7blOJB.png)
对于众多的对象,
实在不知道是什么类型就这么判断下吧
1from collections import Iterable,Iterator
2isinstance([], Iterable) # True
3isinstance(map(lambda x: x-1,range(5)),Iterator) # True
迭代器的特性
最大特点是延迟计算(lazy evaluation)方式返回元素,按需调用call by need
的方式
不是与list等集合数据类型一样一次性将所有元素加载到内存中
它还具备下面几个特点:
- 不能向后移动
- 不能回到开始
- 只能一次迭代
- 不能切片和索引
![](https://i.imgur.com/ZKgz3n5.png)
![一次迭代 一次迭代](https://i.imgur.com/vDYz872.png)
![无法切片和索引 无法切片和索引](https://i.imgur.com/8pGATPg.png)
迭代器应用
节省内存
典型应用:
操作大文件
read
readlines
方法都是将文件一次读到内存中,
文件太大,就会造成内存溢出
通常的做法是
1with open(filename, 'r') as flie:
2 for line in file:
3 print(line)
![](https://i.imgur.com/IPbz3x3.png)
适用场景:
- 不关心元素的随机访问
- 元素的个数不确定
后记
迭代器在python中是个很重要的对象,很多对象都具有迭代器的特性,或是其子对象
生成器是迭代器的一个重要子对象
而python的协程与生成器又有千丝万缕的关系
迭代器->生成器->协程层层递进
迭代器作为一个基础,清楚的认知是很有必要的
下面的是我的公众号二维码图片,欢迎关注我。
![图注:chafezhou公众号 图注:chafezhou公众号](https://i.imgur.com/Cxn6r9K.jpg)