python list next_彻底搞懂Python的__iter__和__next__,Iterable和Iteration

1 从迭代器模式说起

首先我们来谈谈迭代器模式:

1.1 什么是迭代器模式?

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

上UML:Iterator(抽象迭代器):它定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法,例如:用于获取第一个元素的first()方法,用于访问下一个元素的next()方法,用于判断是否还有下一个元素的hasNext()方法,用于获取当前元素的currentItem()方法等,在具体迭代器中将实现这些方法。

ConcreteIterator(具体迭代器):它实现了抽象迭代器接口,完成对聚合对象的遍历,同时在具体迭代器中通过游标来记录在聚合对象中所处的当前位置,在具体实现时,游标通常是一个表示位置的非负整数。

Aggregate(抽象聚合类):它用于存储和管理元素对象,声明一个createIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。

ConcreteAggregate(具体聚合类):它实现了在抽象聚合类中声明的createIterator()方法,该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator实例。

简单解释一些上面UML:

Aggregate类可以理解成是存储数据的容器类,比如Python中的list, map, set等,C++ STL中的vector,list,string等。Aggregate可以通过createIterator方法生成其对应的Iterator类对象。

Iterator类为迭代器,用于遍历,可访问当前元素,也可以迭代至下一个。

以上均是抽象类,根据具体情况,具体实现会有不同,但是暴露的接口都是一致的。

比如我们可以把ConcreteAggregate想象成是C++ STL中的vector,根据vector的具体内部构造,我们需要实现其对应的迭代器类ConcreteIterator,也就是vector::iterator

根据以上UML,我们可以简单写出迭代器模式的接口调用程序:

Aggregate agg = new ConcreteAggregate();

Iterator it = agg.createIterator();

while (it.hasNext()) {

/* do what you want for it or it.currentItem() */

it = it.next();

}

迭代器模式的作用,就是让遍历只聚焦在迭代器Iterator上,而无需了解容器Aggregate内部具体的实现方式、数据存放形式、接口等。

1.2 为什么需要引入迭代器模式?

引入Iterator后可以将遍历与实现分离开来。

这里使用了Iterator的hasNext方法和next方法,并没有调用Aggreate/ConcreteAggregate的方法。也就是说,这里的while循环并不依赖于Aggreate/ConcreteAggregate的实现。

我并不需要知道Aggreate/ConcreteAggregate内部是怎么实现的、数据是如何存取的,我要想遍历它直接傻瓜一直next就可以了啊

如果Aggreate/ConcreteAggregate的内部容器由数组换成了Vector或者List或者其他什么,我之前的代码都是基于迭代器next来

你可能感兴趣的:(python,list,next)