zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    变色龙启动MAC时,错误信息“ntfs_fixup: magic doesn't match:”的解决办法
    显示/隐藏Mac隐藏文件
    Mac 输入法小技巧
    cocos2d popSceneWithTransition()方法
    Mac电脑怎么显示隐藏文件、xcode清除缓存
    Cocos2d-X研究之3.0 场景切换特效汇总
    DevExpresss LookUpEdit详解
    使用First查找集合报错:序列不包含任何匹配元素
    c# devExpress 如何让gridview既可以复制也可以双击跳转
    DevExpress GridView限制列只允许输入数字
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/7248827.html
Copyright © 2011-2022 走看看