range python float_自定义支持 float 的 range 函数
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 函数相关推荐
- 自定义支持 float 的 range 函数
python range() 函数是步进函数,可快速优雅地创建一个整数列表,一般用在 for 循环中.但是 python 自带的 range() 步进函数只支持整数类型,不支持浮点数.那么,为了支持浮 ...
- Python对自定义离散点进行指定多项式函数拟合
自定义离散点进行指定多项式函数拟合 用户自己自己输入坐标点,拟合函数可根据用户输入的多项式的最高次方进行自动拟合函数,拟合方法采用最小二乘法进行函数拟合. (1,2),(2,5),(3,10),(4, ...
- python中range和arange的区别_Python3中range , arange 和linspace 的异同
python3中range , arange 和linspace 的相同点 这三个函数的相同点是: 都可以生成指定数量步长相同的一组数据,而且生成的对象都可以被迭代! 如果只是需要一组指定范围内步长相 ...
- range函数python三个参数_range()函数三种参数的用法
第8篇分享 range()是python的内置函数,用的地方挺多的,目前我经常会在for循环中作为循环的次数来使用,其实range()的用法不仅仅如此,本文给大家介绍下range()函数的三种参数的基 ...
- 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 ...
- Python语言学习之字母R开头函数使用集锦:random/range/replace/reshape用法之详细攻略
Python语言学习之字母R开头函数使用集锦:random/range/replace/reshape用法之详细攻略 random/range/replace/reshape用法 1.random用法 ...
- python基础教程:list转换range()的打印结果
for循环中常见的一个函数是range(),然而有时候直接打印range的时候,得到的结果却不是我们想要的,这个时候,可以用list列表来转换一下range的结果,让我们更清除的打印出range中的元 ...
- 带你自学Python系列(四):range、min、max、sum函数
↑ 点击上方[计算机视觉联盟]关注我们 今天是小编持续更新关于Python的知识总结以及Python实践项目应用的第4天,带你利用零碎时间自学最受欢迎的编程语言之一Python语言.你和小编一起打卡了 ...
- Python学习笔记——for循环和range函数
Python学习笔记--for循环和range函数 Python的for循环 for 目标 in 表达式 :循环体 案例一 >>> example = 'abcdef' >&g ...
最新文章
- Prometheus监控业务指标
- c# try-finally有什么用
- 1016 Phone Bills (25 分) 【未完成】【难度: 中 / 知识点: 模拟】
- Hive分区、分桶操作及其比较(转自:http://blog.csdn.net/epitomizelu/article/details/41911657)
- save product in COMMPR01的调试和调用栈
- pikachu安装以及安装时遇到的的问题——pikachu数据库链接不上config.inc.php 以及侧边栏访问没有反应,只有URL加了个#原因和解决办法
- 剑指offer——最小的K个数和数组中第K大的元素
- jap sql 保存_【hibernate spring data jpa】执行了save()方法 sql语句也执行了,但是数据并未插入数据库中...
- 随想录(虚拟机实现)
- 2021奥斯汀 Pwn2Own黑客大赛落幕,Master of Pwn 诞生
- 【渝粤教育】国家开放大学2018年秋季 7160-22T卫生法学 参考试题
- 点钞机语音怎么打开_我有这些语音识别指令,你都知道吗?
- 《矩阵分析》Ⅳ——三对角矩阵的追赶法matlab实现
- 交易系统开发(五)——华锐柜台简介
- 积分电路与低通滤波器
- unity游戏开发需要学什么?
- Android使用VideoView播放视频
- 情绪管理 | 压力、愤怒、烦恼,面对不良情绪,你会怎么做?
- tan5度用计算机怎么算,tan5度(tan5度怎么求)
- scrapy框架讲解