迭代器(Iterator)
一、什么是迭代器
1、迭代是访问集合中元素的一种方式,迭代器可以记住遍历位置的对象,每当使用其中数据的时候,每次从数据流中取出一个数据,直到数据被取完为止,迭代器只能往前不会后退。【那从这里就看出,一个迭代器具有两个因素:一是迭代一次可返回一个元素,二是可以自动的被迭代,也就是向下走】
–从表面上看,迭代器是一个数据流对象或者是一个容器,每当使用其中数据的时候,每次从数据流中取出一个数据,直到数据被取完为止,而且这些数据不会被重复使用。
–从编码的角度看,迭代器是一种实现了python迭代器协议方法的对象。
python中迭代器协议方法主要有两个:
iter():返回对象本身
next():返回容器中下一个元素或数据。当时用完迭代器中数据时,会引发stopiteration
故在python中只要有类具有上述两种方法,那么这个类就是可迭代的,即这个类是迭代器。我们可以用for来遍历它
二、可迭代对象VS迭代器
1、可迭代对象 不等于迭代器
iterable
: 可迭代对象
,属于python的名词,本质上就是含有__iter__`方法的对象。
python这种学过的可迭代对象iterable
1、序列:字符串、列表、元组
2、非序列:字典、文件
iterator
: 迭代器
,也属于python的名词,只能迭代一次。需要满足如下的迭代器协议
- 定义了
__iter__
方法 - 定义了
__next__
方法。用来返回下一个值,并且当没有数据了,抛出StopIteration
即迭代器需要实现了__next__方法,使用next(data)来依次产出数据(像生孩子一样,next一下生一个,如果没有数据了,就会产生异常。),可迭代对象只是实现了__iter__
方法。因此如果你需要迭代器能够迭代自身,就需要同时实现___iter___
方法,和__next__
方法**(用inter返回元素,用next向下走)**
因此:
即:一个实现了iter方法的对象是可迭代的对象,一个实现next方法并且是可迭代的对象是迭代器。而可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
itertion
: 就是迭代
,一个接一个(one after another),是一个通用的概念,比如一个循环遍历某个数组。
2、 迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。
3、很多时候使用迭代器完成的工作使用列表也可以完成,但是如果有很多值列表就会占用太多的内存,
其中:那for循环本质即 先调用iter()把Iterable变成Iterator在进行循环迭代的。
即for循环内部做了3件事情:
-
调用iter()把可迭代对象转换成迭代器
-
不断的调用迭代器的next()方法
-
处理StopIteration异常,结束循环
class Use:
def __init__(self,x=