首先解释以下迭代器跟可迭代对象(Iterable)的区别,可以直接作用于for循环或者实现了__iter__的对象统称为可迭代对象(Iterable)。可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。
1,可迭代对象
可迭代对象不一定是迭代器,像list是可以被for循环的,但不是一个迭代器,可迭代对象的特征:
一、对象里面包含__iter()__方法的实现,
二、对象的__iter__(self)函数经调用之后会返回一个迭代器,里面包含具体数据获取的实现。
2、迭代器
对象里面包含next()方法的实现,(如果是python3以上版本,是__next__()方法),
next()方法在正确范围内返回期待的数据以及超出范围后能够抛出StopIteration的错误停止迭代。
下面这个程序既是一个迭代器也是一个可迭代对象
程序实现了__iter__(self)方法,并且返回一个自身对象,因为self也是一个迭代器,所以也是一个可迭代对象
值得注意的是fa跟fb指向的是同一个地址,所以在next(fa)后执行next(fb)同样指针会下移,如果不想让fb指向同一个地址,那么需要copy模块的deepcopy方法来深度复制。
3、迭代器的优点:
“流式”数据处理方式减少内存消耗:
比如处理文件,一下猛地把全部数据全部取出来放到内存里面进行处理会导致程序消耗大量内存,有时甚至没法做到
每次调用 next() 方法的时候做两件事:
- 为下一次调用 next() 方法修改状态
- 为当前这次调用生成返回结果