Python-反向迭代和实现反向迭代

案例:

       实现一个连续的浮点数发生器,FloatRange,根据给定范围(start, end) 和步进值,产生一些列的浮点数,例如:FloatRange(3,4,0.2),将产生下列序列:

       正向:3.0 3.2 …… 4.0

       反向:4.0 3.8 …… 3.0

如何实现?

       方法1:列表翻转

#!/usr/bin/python3

l = [1, 2, 3, 4, 5, 6]
l.reverse()
for i in l:
    print(i)
    
# 出现问题,改变了原列表,不可取

       方法2:列表切片

#!/usr/bin/python3

l = [1, 2, 3, 4, 5, 6]
for i in l[::-1]:
    print(i)
    
# 得到了和原列表等大的列表,某种程度上很浪费

       方法3: __ reversed__方法

#!/usr/bin/python3

l = [1, 2, 3, 4, 5, 6]

for i in reversed(l):
    print(i)

如何逻辑整理?

       for循环正向迭代调用__iter__方法,反向迭代调用__reversed__方法,可以定义一个类,写上这些方法

#!/usr/bin/python3


class FloatRange(object):
    def __init__(self, start, end, step):
        self.dot = self.__get_dot_num(step)
        # 有多少个小数点就乘以10的多少次幂,因为浮点数运算不准确,换算成整形数进行计算
        self.start = start*pow(10, self.dot)
        self.end = end*pow(10, self.dot)
        self.step = step*pow(10, self.dot)
        
    def __get_dot_num(self, step):
        # 计算step有多少个小数点
        if isinstance(step, int):
            return step
        else:
            # 通过round实现计算有多少位小数,首创
            for dot in range(len(str(step))+1):
                if step == round(step, dot):
                    return dot

    def __iter__(self):
        # 正向迭代
        while self.start <= self.end:
            yield self.start/pow(10, self.dot)
            self.start += self.step

    def __reversed__(self):
        # 反向迭代
        while self.end >= self.start:
            yield self.end/pow(10,self.dot)
            self.end -= self.step

if __name__ == '__main__':
    
    float_num_1 = FloatRange(2, 5, 0.1)
    float_num_2 = FloatRange(2, 5, 0.1)
    
    # 正向迭代
    for i in float_num_1:
        print(i)
        
    print('_'*60)
    
    # 反向迭代
    for x in reversed(float_num_2):
        print(x)
原文地址:https://www.cnblogs.com/2bjiujiu/p/7248827.html