`

反向迭代器

阅读更多
    要实现一个反向迭代器其实非常简单,只需实现 __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反向迭代器源码

    list反向迭代器源码

    java迭代器模式实现正反向遍历

    在给定的代码示例中,通过创建自定义的迭代器类,实现了对包含10个数字的集合进行正向和反向遍历的功能。 ### 核心概念解析 #### 1. 迭代器接口(Iterator) 迭代器接口定义了访问和遍历聚合元素的方法。在这个...

    关于List集合特有的迭代器的反向遍历

    Listiterator迭代器的方向遍历,在反向遍历时 源码中 index中的初值需要在定义的时候传入size集合长度 或者通过正向遍历,将nextIndex的值变为集合的长度 然后public boolean hasPrevious() { return nextIndex &gt; 0...

    c++迭代器失效问题

    5. **反向迭代器**:反向迭代器是正向迭代器的逆序版本,同样会受到上述失效规则的影响。特别是在插入或删除操作后,反向迭代器需要特别注意,因为它们可能不再指向原来的位置。 6. **STL算法**:使用STL算法(如`...

    设计模式C++学习之迭代器模式(Iterator)

    例如,可以创建不同的迭代器实现,如反向迭代器或只读迭代器。 - **封装性**:迭代器隐藏了集合的内部结构,客户端只需通过迭代器接口操作,无需关心元素是如何存储和组织的。 在C++标准库中,许多容器(如`std::...

    java体系结构之迭代器模式.rar

    - **反向迭代器**:支持反向遍历。 - **条件迭代器**:可以根据特定条件进行迭代。 - **远程迭代器**:允许对远程或抽象聚合的遍历。 6. **Java集合框架中的迭代器**:除了基础的`Iterator`接口,Java还提供了`...

    关于迭代器的Demo

    - 对于支持双向迭代的容器,如双向链表,还可以使用反向迭代器进行从后往前的遍历。 8. **迭代器失效**: - 某些操作如插入、删除元素可能导致迭代器失效,因此在进行这些操作后,需重新获取有效迭代器。 9. **...

    C++STL实验报告-迭代器和非变异算法

    实验的目标是熟悉set、multiset、map和multimap这四种关联容器的使用,以及掌握插入迭代器和反向迭代器的操作,并应用四种基本的非变异算法。 首先,set和multiset是STL中的两种关联容器,它们分别存储唯一元素和...

    Stl的list容器迭代器的用法1

    3. `rbegin()`: 返回指向容器末尾的反向迭代器,相当于正向迭代器向后移动到最后一个元素。 4. `rend()`: 返回指向容器开头之前的反向迭代器,标志着反向遍历的结束。 5. `cbegin()`、`cend()`: 类似于`begin()`和`...

    什么是C++的迭代器.docx

    更高级的迭代器支持更复杂的功能,如反向迭代器(reverse_iterator)用于反向遍历容器,以及输入和输出迭代器用于I/O操作。 总的来说,C++的迭代器是C++标准库中实现泛型编程和容器操作的核心工具,它们为程序员...

    2 迭代器模式-课程内容.rar

    4. 实现多种类型的迭代器,如快速迭代器、反向迭代器等。 ### 五、优点与缺点 **优点**: 1. 它支持以不同的方式遍历一个聚合对象。 2. 迭代器简化了聚合类。 3. 在同一个聚合上可以有多个遍历。 4. 在迭代器模式...

    java基础 集合-22-迭代器设计模式

    - **反向迭代器**:从集合的末尾开始向前遍历。`ListIterator`接口扩展了`Iterator`,并提供了反向遍历和访问元素的前一个或后一个的能力。 4. **使用迭代器的实例** ```java List&lt;String&gt; list = new ArrayList...

    迭代器模式

    2. **反向迭代器**:允许用户从后向前遍历聚合对象。 3. **远程迭代器**:在分布式系统中,允许客户端在远程服务器上遍历对象。 标签中提到的“源码”,意味着可能涉及迭代器模式的具体实现,例如查看Java集合框架...

    STL详细终稿431

    反向迭代器的行为与正向迭代器相反,递增反向迭代器会使其指向前一个元素。 4. `array::rend` 类似地,`rend`返回反向迭代器,指向容器的第一个元素之前的位置。在反向迭代中,递增反向迭代器将使其指向下个元素。...

    c语言实现泛型红黑树(含迭代器) 见说明

    并单独提供一个正向迭代器与反向迭代器 也提供了3种遍历方式 前中后序 参见测试用例 其维护红黑树性质的相关代码 几乎是句句含带注释 使用面向对象编程思想构建代码 并可在windows和linux下 c89标准编译通过

    65丨迭代器模式(上):相比直接遍历集合数据,使用迭代器有哪些优势?1

    3. **支持多种遍历策略**:迭代器模式使得添加新的遍历方式变得容易,例如反向遍历、只读遍历等。 4. **安全的并发访问**:在多线程环境下,迭代器可以提供线程安全的遍历,而直接访问集合可能会引发并发修改异常。 ...

    range_access.rar_The First

    2. **rbegin()** 函数:对于反向迭代器,`rbegin()` 返回指向容器最后一个元素的反向迭代器,但对于访问第一个元素,我们可以递增反向迭代器一次,使其变为指向第一个元素的反向迭代器。`rend()` 类似,但表示容器的...

    python如何实现反向迭代

    - __reversed__方法:这是Python内置的反向迭代器生成器函数,可以生成一个反向迭代器,直接进行反向迭代,不会改变原列表,也不会创建新的列表副本,效率较高。 3. 定义支持反向迭代的类 对于自定义类,如果想要...

    迭代器模式demo

    - **多种遍历方式**:可以通过实现不同类型的迭代器来支持不同的遍历顺序,如正向、反向、选择性遍历等。 - **增加代码可读性**:迭代器模式提供了统一的接口,使得客户端代码可以一致地遍历各种类型的聚合对象。 ...

Global site tag (gtag.js) - Google Analytics