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