python如何实现反向迭代

本文实例为大家分享了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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python迭代dict的key和value的方法

    迭代dict的key和value 我们了解了如何迭代 dict 的key和value,那么,在一个 for 循环中,能否同时迭代 key和value?答案是肯定的. 首先,我们看看 dict 对象的 items() 方法返回的值: >>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } >>> print d.items() [('Lisa', 85), ('Adam', 95), ('Bart', 59)] 可以看到,items(

  • Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例

    本文实例讲述了python从任意长度的可迭代对象中分解元素操作.分享给大家供大家参考,具体如下: 从某个可迭代对象中分解出N个元素,但是可迭代对象的长度可能超过N,会出现"分解值过多"的异常: 使用"*表达式"来解决该问题: Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright",

  • Jacobi迭代算法的Python实现详解

    import numpy as np import time 1.1 Jacobi迭代算法 def Jacobi_tensor_V2(A,b,Delta,m,n,M): start=time.perf_counter()#开始计时 find=0#用于标记是否在规定步数内收敛 X=np.ones(n)#迭代起始点 x=np.ones(n)#用于存储迭代的中间结果 d=np.ones(n)#用于存储Ax**(m-2)的对角线部分 m1=m-1 m2=2-m for i in range(M): pr

  • Python数据结构与算法之图的基本实现及迭代器实例详解

    本文实例讲述了Python数据结构与算法之图的基本实现及迭代器.分享给大家供大家参考,具体如下: 这篇文章参考自<复杂性思考>一书的第二章,并给出这一章节里我的习题解答. (这书不到120页纸,要卖50块!!,一开始以为很厚的样子,拿回来一看,尼玛.....代码很少,给点提示,然后让读者自己思考怎么实现) 先定义顶点和边 class Vertex(object): def __init__(self, label=''): self.label = label def __repr__(sel

  • 详解Python3中的迭代器和生成器及其区别

    介绍 本篇将介绍Python3中的迭代器与生成器,描述可迭代与迭代器关系,并实现自定义类的迭代器模式. 迭代的概念 上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值 注:循环不是迭代 while True: #只满足重复,因而不是迭代 print('====>')  迭代器 1.为什么要有迭代器? 对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式. 2.迭代器定义: 迭代器:可迭代对象执行__iter__方法,得到的结果

  • Gauss-Seidel迭代算法的Python实现详解

    import numpy as np import time 1.1 Gauss-Seidel迭代算法 def GaussSeidel_tensor_V2(A,b,Delta,m,n,M): start=time.perf_counter() find=0 X=np.ones(n) d=np.ones(n) m1=m-1 m2=2-m for i in range(M): print('X',X) x=np.copy(X) #迭代更新 for j in range(n): a=np.copy(A

  • python如何实现反向迭代

    本文实例为大家分享了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

  • Python 如何反方向迭代一个序列

    问题 你想反方向迭代一个序列 解决方案 使用内置的 reversed() 函数,比如: >>> a = [1, 2, 3, 4] >>> for x in reversed(a): ... print(x) ... 4 3 2 1 反向迭代仅仅当对象的大小可预先确定或者对象实现了 __reversed__() 的特殊方法时才能生效.如果两者都不符合,那你必须先将对象转换为一个列表才行,比如: # Print a file backwards f = open('some

  • Python专用方法与迭代机制实例分析

    本文实例讲述了Python专用方法与迭代机制,分享给大家供大家参考之用.具体分析如下: 众所周知,Python 设计哲学是"优雅"."明确"."简单",对于一件事只用一种最好的方法来做,而这种优雅在于背后很自然的隐藏了很多细节.比如对一些对象直接用for 语句来迭代,一些全局函数可以作用于很多具有共同特征的对象,还有生成器装饰器自省等特性.其中很多实现都是借助 Python  内部专用方法,而对外则使用统一的全局函数来进行操作,在配合一些语法糖,

  • python opencv 直方图反向投影的方法

    本文介绍了python opencv 直方图反向投影的方法,分享给大家,具体如下: 目标: 直方图反向投影 原理: 反向投影可以用来做图像分割,寻找感兴趣区间.它会输出与输入图像大小相同的图像,每一个像素值代表了输入图像上对应点属于目标对象的概率,简言之,输出图像中像素值越高的点越可能代表想要查找的目标.直方图投影经常与camshift(追踪算法)算法一起使用. 算法实现的方法,首先要为包含我们感兴趣区域的图像建立直方图(样例要找一片草坪,其他的不要).被查找的对象最好是占据整个图像(图像里全是

  • 浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器

    1.iterable iterator区别 要了解两者区别,先要了解一下迭代器协议: 迭代器协议是指:对象需要提供__next__()方法,它返回迭代中的元素,在没有更多元素后,抛出StopIteration异常,终止迭代. 可迭代对象就是:实现了迭代器协议的对象. 协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)通过迭代器协议访问对象,因此,for循环并不需要知道对象具体是什么,只需要知道对象能够实现迭代器协议即可. 迭代器(ite

  • python 对给定可迭代集合统计出现频率,并排序的方法

    给定一个可迭代sequence,对其中的值进行出现次数统计: 方法1: def get_counts(sequence): counts = {} for x in sequence: if x in counts: counts[x] += 1 else: counts[x] = 1 return counts 方法2: 利用python中内置的collections from collections import defaultdict def get_counts2(sequence):

  • python使用 zip 同时迭代多个序列示例

    本文实例讲述了python使用 zip 同时迭代多个序列.分享给大家供大家参考,具体如下: zip 可以平行地遍历多个迭代器 python 3中zip相当于生成器,遍历过程中产生元祖,python2会把元祖生成好,一次性返回整份列表 zip(x,y,z)会生成一个可返回元组 (x,y,z) 的迭代器 >>> x = [1, 2, 3, 4, 5] >>> y = ['a', 'b', 'c', 'd', 'e'] >>> z = ['a1', 'b2'

  • python 实现一个反向单位矩阵示例

    反向单位矩阵 单位矩阵即对角线为 1,如下: ​ 那么反向的单位矩阵就是反对角线为 1: ​ 左右镜像操作 这里采用 numpy 实现. 方案 1 import numpy as np A = np.eye(3) print(A) B1 = np.fliplr(A) print(B1) 方案 2 B2 = A[:,::-1] print(B2) 这面这两种方案就可以顺利实现反向单位矩阵的定义了.此外,我们拓展了另外两种操作. 上下镜像操作 方法 1 import numpy as np b =

  • Python使用enumerate获取迭代元素下标

    这篇文章主要介绍了python使用enumerate获取迭代元素下标,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 以前迭代的时候,需要获取次数都是如下格式: index=1 for node in nodes: if index==3: continue print(node.text_content())<br>index+=1 通过for循环外层定义一个变量来进行循环,然后内部进行++操作. for i ,row in enumerat

  • python学习之可迭代对象、迭代器、生成器

    Iterable – 可迭代对象 能够逐一返回其成员项的对象. 可迭代对象的例子包括所有序列类型 (例如 list, str 和 tuple) 以及某些非序列类型例如 dict, 文件对象以及定义了__iter__()方法或是实现了序列语义的__getitem__() 方法的任意自定义类对象. 可迭代对象可用于 for 循环以及许多其他需要一个序列的地方(zip().map() -).当一个可迭代对象作为参数传给内置函数 iter() 时,它会返回该对象的迭代器.这种迭代器适用于对值集合的一次性

随机推荐