要求:实现一个连续浮点数发生器FloatRange(和range类似),根据给定范围(start, end)和步长(step)产生一系列连续浮点数。如迭代FloatRange(3.0, 4.0, 0.2)可产生序列:
正向:3.0 → 3.2 → 3.4 → 3.6 → 3.8 → 4.0 反向:4.0 → 3.8 → 3.6 → 3.4 → 3.2 → 3.0
解决方案:
实现反向迭代协议的__reversed__()
方法,它返回一个反向迭代器。
- 对于反向迭代:
使用内置的reversed()
函数会调用反向迭代协议的__reversed__()
方法,它返回一个反向迭代器,通常用于实现列表的反向迭代。
对于自定义类的反向迭代,可以通过在自定义类上实现__reversed__()
方法来实现反向迭代。
- 方案示例:
from decimal import Decimalclass FloatRange: def __init__(self, a, b, step): self.a = Decimal(str(a)) self.b = Decimal(str(b)) self.step = Decimal(str(step)) def __iter__(self): #正向迭代 t = self.a while t <= self.b: yield t t += self.step def __reversed__(self): #反向迭代 t = self.b while t >= self.a: yield t t -= self.step fr = FloatRange(3.0, 4.0, 0.2)for i in fr: print(i)print('-' * 10)for i in reversed(fr): print(i)
结果:
3.0 3.2 3.4 3.6 3.8 4.0 ---------- 4.0 3.8 3.6 3.4 3.2 3.0
在实例化FloatRange类后,通过fr
来调用__iter__()
方法实现正向迭代,通过reversed(fr)
来调用__reversed__()
方法实现反向迭代。