美文网首页慕课网实战学习笔记编程语言爱好者程序员
如何进行反向迭代以及如何实现反向迭代

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

作者: SmallRookie | 来源:发表于2017-07-27 01:29 被阅读23次
    实际案例

    实现一个连续浮点数发生器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
    

    相关文章

      网友评论

        本文标题:如何进行反向迭代以及如何实现反向迭代

        本文链接:https://www.haomeiwen.com/subject/tynokxtx.html