python range() 函数是步进函数,可快速优雅地创建一个整数列表,一般用在 for 循环中。但是 python 自带的 range() 步进函数只支持整数类型,不支持浮点数。那么,为了支持浮点数,我们只能自定义一个函数。

1、Python 内建函数 range() 的语法

range(start, stop[, step])

1.1、参数说明:start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);

stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5

step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

1.2、运行实例

>>> list(range(2, 98, 3))

[2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95]

2、自定义支持 float 的步进函数

2.1、功能要求

输入 Input:

start (float) : 计数从 start 开始。默认是从 0 开始。

end (float) : 计数到 stop 结束,但不包括 stop。

step (float) : 步长,默认为 1,如为浮点数,参照 steps 小数位数。

输出 Output:

float 数据类型的列表

按照上面的功能要求,我的思路是利用原有的、只支持整数的 range 函数。那么就需要将 step 这个浮点型数据转换成整型类型,这不是简单的舍去小数取整数,而是将小数部分乘以适当的 10**n(n 为小数部分的位数),整体将浮点数转换成整型。

2.2、取 step 的小数位数

2.2.1、试错1-利用简单的算术运算

>>> import math

>>> b = math.modf(5.02)

>>> b

(0.019999999999999574, 5.0)

>>> b[0]

0.019999999999999574

>>> float(5.02)-int(5.02)

0.019999999999999574

>>> 5.02 - int(5.02)

0.019999999999999574

>>>

很明显,由于 Python 的浮点数的精度问题,我们使用简单的算术运算方法无法获得精准的小数位数。

2.2.2、试错2-decimal 模块

>>> import decimal

>>> decimal.Decimal(5.02)

Decimal('5.019999999999999573674358543939888477325439453125')

>>> decimal.Decimal(5.02) -decimal.Decimal(5)

Decimal('0.01999999999999957367435854394')

很遗憾,这个小数部分也会自动变长,无法达到自己的要求。而 decimal 模块种的 getcontext().prec 可以设置有效的小数位数,但是无法读取给定的浮点数的小数位数。故这个模块也无法解决自己的问题。

2.2.3、 将浮点数转换成字符串

>>> str(48.36).index(".")

2

>>> len(str(48.36))

5

>>> len(str(48.36))-1-str(48.36).index(".") # 此处减 1 是因为小数点也占一位

2 # 得出小数部分的位数

2.3、自定义支持 float 的步进函数

def float_range(start, stop, step):

''' 支持 float 的步进函数输入 Input:start (float) : 计数从 start 开始。默认是从 0 开始。end (float) : 计数到 stop 结束,但不包括 stop。step (float) : 步长,默认为 1,如为浮点数,参照 steps 小数位数。输出 Output:浮点数列表例子 Example:>>> print(float_range(3.612, 5.78, 0.22))[3.612, 3.832, 4.052, 4.272, 4.492, 4.712, 4.932, 5.152, 5.372]'''

start_digit = len(str(start))-1-str(start).index(".") # 取开始参数小数位数

stop_digit = len(str(stop))-1-str(stop).index(".") # 取结束参数小数位数

step_digit = len(str(step))-1-str(step).index(".") # 取步进参数小数位数

digit = max(start_digit, stop_digit, step_digit) # 取小数位最大值

return [(start*10**digit+i*step*10**digit)/10**digit for i in range(int((stop-start)//step))]

另一种更简单的选择

如果你跟随我的思路,理解了这些内容,那么其实最后的 float_range 函数中有一些多余的内容。 只要你的需求中能够忽视小数的精度问题,那么你可以使用如下函数:

def float_range(start, stop, step):

''' 支持 float 的步进函数输入 Input:start (float) : 计数从 start 开始。默认是从 0 开始。end (float) : 计数到 stop 结束,但不包括 stop。step (float) : 步长,默认为 1,如为浮点数,参照 steps 小数位数。输出 Output:浮点数列表例子 Example:>>> print(float_range(3.612, 5.78, 0.22))[3.612, 3.8320000000000003, 4.0520000000000005, 4.272, 4.492, 4.712, 4.932, 5.152, 5.372]'''

return [start+i*step for i in range(int((stop-start)//step))]

其实这个函数的实现只需要最后的列表推导即可,但是列表中的浮点数的小数精度可能不随人愿。

range python float_自定义支持 float 的 range 函数相关推荐

  1. 自定义支持 float 的 range 函数

    python range() 函数是步进函数,可快速优雅地创建一个整数列表,一般用在 for 循环中.但是 python 自带的 range() 步进函数只支持整数类型,不支持浮点数.那么,为了支持浮 ...

  2. Python对自定义离散点进行指定多项式函数拟合

    自定义离散点进行指定多项式函数拟合 用户自己自己输入坐标点,拟合函数可根据用户输入的多项式的最高次方进行自动拟合函数,拟合方法采用最小二乘法进行函数拟合. (1,2),(2,5),(3,10),(4, ...

  3. python中range和arange的区别_Python3中range , arange 和linspace 的异同

    python3中range , arange 和linspace 的相同点 这三个函数的相同点是: 都可以生成指定数量步长相同的一组数据,而且生成的对象都可以被迭代! 如果只是需要一组指定范围内步长相 ...

  4. range函数python三个参数_range()函数三种参数的用法

    第8篇分享 range()是python的内置函数,用的地方挺多的,目前我经常会在for循环中作为循环的次数来使用,其实range()的用法不仅仅如此,本文给大家介绍下range()函数的三种参数的基 ...

  5. python中for in range的用法_Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  6. Python语言学习之字母R开头函数使用集锦:random/range/replace/reshape用法之详细攻略

    Python语言学习之字母R开头函数使用集锦:random/range/replace/reshape用法之详细攻略 random/range/replace/reshape用法 1.random用法 ...

  7. python基础教程:list转换range()的打印结果

    for循环中常见的一个函数是range(),然而有时候直接打印range的时候,得到的结果却不是我们想要的,这个时候,可以用list列表来转换一下range的结果,让我们更清除的打印出range中的元 ...

  8. 带你自学Python系列(四):range、min、max、sum函数

    ↑ 点击上方[计算机视觉联盟]关注我们 今天是小编持续更新关于Python的知识总结以及Python实践项目应用的第4天,带你利用零碎时间自学最受欢迎的编程语言之一Python语言.你和小编一起打卡了 ...

  9. Python学习笔记——for循环和range函数

    Python学习笔记--for循环和range函数 Python的for循环 for 目标 in 表达式 :循环体 案例一 >>> example = 'abcdef' >&g ...

最新文章

  1. Prometheus监控业务指标
  2. c# try-finally有什么用
  3. 1016 Phone Bills (25 分) 【未完成】【难度: 中 / 知识点: 模拟】
  4. Hive分区、分桶操作及其比较(转自:http://blog.csdn.net/epitomizelu/article/details/41911657)
  5. save product in COMMPR01的调试和调用栈
  6. pikachu安装以及安装时遇到的的问题——pikachu数据库链接不上config.inc.php 以及侧边栏访问没有反应,只有URL加了个#原因和解决办法
  7. 剑指offer——最小的K个数和数组中第K大的元素
  8. jap sql 保存_【hibernate spring data jpa】执行了save()方法 sql语句也执行了,但是数据并未插入数据库中...
  9. 随想录(虚拟机实现)
  10. 2021奥斯汀 Pwn2Own黑客大赛落幕,Master of Pwn 诞生
  11. 【渝粤教育】国家开放大学2018年秋季 7160-22T卫生法学 参考试题
  12. 点钞机语音怎么打开_我有这些语音识别指令,你都知道吗?
  13. 《矩阵分析》Ⅳ——三对角矩阵的追赶法matlab实现
  14. 交易系统开发(五)——华锐柜台简介
  15. 积分电路与低通滤波器
  16. unity游戏开发需要学什么?
  17. Android使用VideoView播放视频
  18. 情绪管理 | 压力、愤怒、烦恼,面对不良情绪,你会怎么做?
  19. tan5度用计算机怎么算,tan5度(tan5度怎么求)
  20. scrapy框架讲解

热门文章

  1. 贪心算法--乘船问题
  2. java银器锁,长命锁、银镯子,这种首饰能给孩子随便戴吗?需要注意这几点
  3. 太原警察学院计算机应用技术,山西警察学院高招
  4. php array_push 二维数组,arraypush js二维数组push的方法
  5. [附源码]计算机毕业设计springboot防疫物资捐赠
  6. memset二维数组赋值问题
  7. 【题解】POJ2311 Cutting Game
  8. Java经典排序算法:选择排序,动图演示排序过程
  9. ROS知识:如何打包 ROS 项目(as a snap)
  10. JAVA 变量的赋值