要求:实现一个连续浮点数发生器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__()方法实现反向迭代。