案例:

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

Python-反向迭代和实现反向迭代的更多相关文章

  1. 8、如何实现可迭代对象和迭代器对象 9、如何使用生成器函数实现可迭代对象 10、如何进行反向迭代以及如何实现反向迭代 11、如何对迭代器做切片操作 12、如何在一个for语句中迭代多个可迭代对象

    8.如何实现可迭代对象和迭代器对象 PS:注意重载Iterator方法的时候,需要和原来的方法名一样,否则创建实例时会报错 from collections import Iterator,Itera ...

  2. Python 学习 第六篇:迭代和解析

    Python中的迭代是指按照元素的顺序逐个调用的过程,迭代概念包括:迭代协议.可迭代对象和迭代器三个概念. 迭代协议是指有__next__()函数的对象会前进到下一个结果,而到达系列的末尾时,则会引发 ...

  3. 流畅的python第十四章可迭代的对象,迭代器和生成器学习记录

    在python中,所有集合都可以迭代,在python语言内部,迭代器用于支持 for循环 构建和扩展集合类型 逐行遍历文本文件 列表推导,字典推导和集合推导 元组拆包 调用函数时,使用*拆包实参 本章 ...

  4. python开发函数进阶:可迭代的&迭代器&生成器

    一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的   iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不 ...

  5. Python for循环通过序列索引迭代

    Python for 循环通过序列索引迭代: 注:集合 和 字典 不可以通过索引进行获取元素,因为集合和字典都是无序的. 使用 len (参数) 方法可以获取到遍历对象的长度. 程序: strs = ...

  6. python迭代-如何在一个for语句中迭代多个可迭代对象

    如何在一个for语句中迭代多个可迭代对象 问题举例 (1)某班学生期末考试成绩,语文,数学,英语分别存储在3个列表中,同时迭代三个列表,计算每个学生的总分 (2)某年级有4个班,某次考试每班英语成绩分 ...

  7. python_如何在一个for循环中迭代多个可迭代对象?

    案例: 某班学生期末考试成绩,语文.数学.英语分别存储在3个列表中,同时迭代三个列表.,计算每个学生的总分(并行) 某年级有4个班,某次英语成绩分别记录在4个列表中,依次迭代每个列表,统计全年级高于9 ...

  8. ios开发数据库版本迁移手动更新迭代和自动更新迭代艺术(二)

    由于大家都热衷于对ios开发数据库版本迁移手动更新迭代和自动更新迭代艺术(一)的浏览下面我分享下我的源文件git仓库: 用法(这边我是对缓存的一些操作不需要可以省去):https://github.c ...

  9. Python-如何在一个for循环中迭代多个可迭代对象?

    案例: 某班学生期末考试成绩,语文.数学.英语分别存储在3个列表中,同时迭代三个列表.,计算每个学生的总分(并行) 某年级有4个班,某次英语成绩分别记录在4个列表中,依次迭代每个列表,统计全年级高于9 ...

  10. python迭代-如何实现反向迭代

    如何实现反向迭代 问题举例 实现一个连续浮点数发生器FloatRange,根据给定范围(start, end)和步进值(step) 产生一系列连续的浮点数,如FloatRange(3.0, 4.0, ...

随机推荐

  1. 【Docker】Docker安装运行dubbo-admin

    运行dubbo-admin服务, 此服务需要单独启动一个zookeeper容器 dubbo-admin将监听所有注册到zookeeper的服务, dubbo-admin默认端口8080 1 运行一个z ...

  2. Codeforces1409 题解(A-F)

    A. Yet Another Two Integers Problem 最优的操作中,\(k = \min(10, abs(a - b))\),记\(d=abs(a-b)\),最终的答案为\(ans ...

  3. Codeforces 1321E World of Darkraft: Battle for Azathoth

    题意 有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\). 有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\). 有\(p\)个怪,第\ ...

  4. TinkPHP5.1开发注意事项

    1.新下载的框架文件,开发前先开启调试配置 config目录下app.php文件 // 应用调试模式 'app_debug'              => true, 2.每新建一个方法,都要 ...

  5. JS -- 操作符和数组

    一.Javascript常用操作符 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  6. linux 多进程

    Linux下的多进程编程初步 Linux下的多进程编程初步 多进程编程 1 Linux下进程的结构 2 Linux下的进程控制 21 僵尸进程 22 fork 23 exec 函数族 3 Linux下 ...

  7. [LeetCode]67. 二进制求和(字符串)(数学)

    题目 给你两个二进制字符串,返回它们的和(用二进制表示). 输入为 非空 字符串且只包含数字 1 和 0. 题解 两个字符串从低位开始加,前面位不够补0.维护进位,最后加上最后一个进位,最后反转结果字 ...

  8. python文件的相关操作

    python 目录 python 1.python文件的介绍 使用文件的目的 Python文件的类型主要有两种:文本文件和二进制文件. 操作文件的流程主要有三步:打开-操作-关闭操作. 2.文件的打开 ...

  9. 微服务架构之SpringCloud

    微服务架构之SpringCloud介绍 1.什么是微服务 2.SpringCloud架构 3.SpringCloud组件 4.微服务相关技术 Docker Jenkins

  10. JDK15正式发布,划时代的ZGC同时宣布转正

    你发任你发,我用Java8.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BA ...