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

来源:互联网 发布:网络错误代码10071 编辑:程序博客网 时间:2024/06/06 16:21
实际案例

实现一个连续浮点数发生器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.stepif __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.03.23.43.63.84.04.03.83.63.43.23.0
原创粉丝点击