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

实际案例

实现一个连续浮点数发生器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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值