如何进行反向迭代以及如何实现反向迭代

实际案例

实现一个连续浮点数发生器FloatRange(和xrange类似),根据给定范围(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
正向

我们首先思考如何实现正向迭代。回想一下之前的知识点,我们可以实现__iter__()返回一个迭代器对象,这样我们不就可以实现正向迭代吗?

代码如下:

def __iter__(self):

    t = self.start
    while round(t, 2) <= round(self.end, 2):
        yield t
        t += self.step

由于实际案例中是对浮点数进行处理,因此我们在此处使用round()实现对浮点数的四舍五入。

反向

在列表中,如果我们要将列表反向迭代通常使用reverse()。但这个方法有个缺陷就是会改变列表。因此,我们推荐使用reversed(),它会返回一个迭代器。这里,我们可以实现__reversed__()解决反向迭代问题。

代码如下:

def __reversed__(self):

    t = self.end
    while round(t, 2) >= round(self.start, 2):
        yield t
        t -= self.step

该程序的最终代码如下:

# -*- coding: utf-8 -*-

class FloatRange:

    def __init__(self, start, end, step):
        self.start = start
        self.end = end
        self.step = step

    # 正向迭代
    def __iter__(self):

        t = self.start
        while round(t, 2) <= round(self.end, 2):
            yield t
            t += self.step
    # 反向迭代
    def __reversed__(self):

        t = self.end
        while round(t, 2) >= round(self.start, 2):
            yield t
            t -= self.step


if __name__ == "__main__":

    for x in FloatRange(3.0, 4.0, 0.2):
        print x

    print ""

    for x in reversed(FloatRange(3.0, 4.0, 0.2)):
        print x

运行结果为:

3.0
3.2
3.4
3.6
3.8
4.0

4.0
3.8
3.6
3.4
3.2
3.0

你可能感兴趣的:(如何进行反向迭代以及如何实现反向迭代)