要实现一个反向迭代器其实非常简单,只需实现 __reversed__ 这个特殊方法即可,它会被 python 内置的 reversed 函数所调用。反向迭代器在数据量很多时可以改善代码性能,因为它不需要把数据填充到一个列表中然后再去反向迭代该列表。
下面这个示例是对内置函数 range 的简单模拟:
class Countdown:
def __init__(self, start, stop, step=1):
if not (isinstance(start, int) and isinstance(stop, int) and isinstance(step, int)):
raise TypeError("All arguments need to be integers.")
self._start = start
self._stop = stop
self._step = step
def __iter__(self):
n = self._start
if self._step > 0:
while n < self._stop:
yield n
n += self._step
else:
while n > self._stop:
yield n
n += self._step
raise StopIteration
def __reversed__(self):
return Countdown(self._stop-1, self._start-1, -self._step)
运行示例:
>>> for i in Countdown(1.1, 8.2):
print(i)
Traceback (most recent call last):
File "<pyshell#53>", line 1, in <module>
for i in Countdown(1.1, 8.2):
File "<pyshell#50>", line 4, in __init__
raise TypeError("All arguments need to be integers.")
TypeError: All arguments need to be integers.
>>>
>>> for i in Countdown(1, 8, 2):
print(i)
1
3
5
7
>>>
>>> for i in reversed( Countdown(1, 8, 2) ):
print(i)
7
5
3
1
>>>
这里之所以限制参数为整数而非任意实数,主要是因为浮点数的精度问题会让代码变得比较臃肿。
分享到:
相关推荐
list反向迭代器源码
在给定的代码示例中,通过创建自定义的迭代器类,实现了对包含10个数字的集合进行正向和反向遍历的功能。 ### 核心概念解析 #### 1. 迭代器接口(Iterator) 迭代器接口定义了访问和遍历聚合元素的方法。在这个...
Listiterator迭代器的方向遍历,在反向遍历时 源码中 index中的初值需要在定义的时候传入size集合长度 或者通过正向遍历,将nextIndex的值变为集合的长度 然后public boolean hasPrevious() { return nextIndex > 0...
5. **反向迭代器**:反向迭代器是正向迭代器的逆序版本,同样会受到上述失效规则的影响。特别是在插入或删除操作后,反向迭代器需要特别注意,因为它们可能不再指向原来的位置。 6. **STL算法**:使用STL算法(如`...
例如,可以创建不同的迭代器实现,如反向迭代器或只读迭代器。 - **封装性**:迭代器隐藏了集合的内部结构,客户端只需通过迭代器接口操作,无需关心元素是如何存储和组织的。 在C++标准库中,许多容器(如`std::...
- **反向迭代器**:支持反向遍历。 - **条件迭代器**:可以根据特定条件进行迭代。 - **远程迭代器**:允许对远程或抽象聚合的遍历。 6. **Java集合框架中的迭代器**:除了基础的`Iterator`接口,Java还提供了`...
- 对于支持双向迭代的容器,如双向链表,还可以使用反向迭代器进行从后往前的遍历。 8. **迭代器失效**: - 某些操作如插入、删除元素可能导致迭代器失效,因此在进行这些操作后,需重新获取有效迭代器。 9. **...
实验的目标是熟悉set、multiset、map和multimap这四种关联容器的使用,以及掌握插入迭代器和反向迭代器的操作,并应用四种基本的非变异算法。 首先,set和multiset是STL中的两种关联容器,它们分别存储唯一元素和...
3. `rbegin()`: 返回指向容器末尾的反向迭代器,相当于正向迭代器向后移动到最后一个元素。 4. `rend()`: 返回指向容器开头之前的反向迭代器,标志着反向遍历的结束。 5. `cbegin()`、`cend()`: 类似于`begin()`和`...
更高级的迭代器支持更复杂的功能,如反向迭代器(reverse_iterator)用于反向遍历容器,以及输入和输出迭代器用于I/O操作。 总的来说,C++的迭代器是C++标准库中实现泛型编程和容器操作的核心工具,它们为程序员...
4. 实现多种类型的迭代器,如快速迭代器、反向迭代器等。 ### 五、优点与缺点 **优点**: 1. 它支持以不同的方式遍历一个聚合对象。 2. 迭代器简化了聚合类。 3. 在同一个聚合上可以有多个遍历。 4. 在迭代器模式...
- **反向迭代器**:从集合的末尾开始向前遍历。`ListIterator`接口扩展了`Iterator`,并提供了反向遍历和访问元素的前一个或后一个的能力。 4. **使用迭代器的实例** ```java List<String> list = new ArrayList...
2. **反向迭代器**:允许用户从后向前遍历聚合对象。 3. **远程迭代器**:在分布式系统中,允许客户端在远程服务器上遍历对象。 标签中提到的“源码”,意味着可能涉及迭代器模式的具体实现,例如查看Java集合框架...
反向迭代器的行为与正向迭代器相反,递增反向迭代器会使其指向前一个元素。 4. `array::rend` 类似地,`rend`返回反向迭代器,指向容器的第一个元素之前的位置。在反向迭代中,递增反向迭代器将使其指向下个元素。...
并单独提供一个正向迭代器与反向迭代器 也提供了3种遍历方式 前中后序 参见测试用例 其维护红黑树性质的相关代码 几乎是句句含带注释 使用面向对象编程思想构建代码 并可在windows和linux下 c89标准编译通过
3. **支持多种遍历策略**:迭代器模式使得添加新的遍历方式变得容易,例如反向遍历、只读遍历等。 4. **安全的并发访问**:在多线程环境下,迭代器可以提供线程安全的遍历,而直接访问集合可能会引发并发修改异常。 ...
2. **rbegin()** 函数:对于反向迭代器,`rbegin()` 返回指向容器最后一个元素的反向迭代器,但对于访问第一个元素,我们可以递增反向迭代器一次,使其变为指向第一个元素的反向迭代器。`rend()` 类似,但表示容器的...
- __reversed__方法:这是Python内置的反向迭代器生成器函数,可以生成一个反向迭代器,直接进行反向迭代,不会改变原列表,也不会创建新的列表副本,效率较高。 3. 定义支持反向迭代的类 对于自定义类,如果想要...
- **多种遍历方式**:可以通过实现不同类型的迭代器来支持不同的遍历顺序,如正向、反向、选择性遍历等。 - **增加代码可读性**:迭代器模式提供了统一的接口,使得客户端代码可以一致地遍历各种类型的聚合对象。 ...