自定义支持 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))]
其实这个函数的实现只需要最后的列表推导即可,但是列表中的浮点数的小数精度可能不随人愿。
自定义支持 float 的 range 函数相关推荐
- range python float_自定义支持 float 的 range 函数
python range() 函数是步进函数,可快速优雅地创建一个整数列表,一般用在 for 循环中.但是 python 自带的 range() 步进函数只支持整数类型,不支持浮点数.那么,为了支持浮 ...
- 自定义 C++ 中的 range() 函数
在 Python 生成连续的可迭代的序列,常用十分 convenient 的 range()函数(包含左端点,不包含右端点): # Python >>> range(5) range ...
- python自定义一个函数求序列中的偶数_使用range函数创建一个从2到10的偶数列表 alist...
[多选题]在Python中添加注释可以使用哪些符号? [简答题]给定一个包含若干个整数的列表alist,要求返回输出列表blist,blist中的元素为 与alist对应位置上的元素之外其余各元素的乘 ...
- python开发_python中的range()函数
python中的range()函数的功能hen强大,所以我觉得很有必要和大家分享一下 就好像其API中所描述的: If you do need to iterate over a sequence o ...
- [转载] Python|range函数用法完全解读
参考链接: Python | range()不返回迭代器 迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代 ...
- Python|range函数用法完全解读
迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成迭 ...
- Python中的range函数和arange函数的区别与联系
[问题发现] 相信很多使用Python的小伙伴,都用到过range()函数,进行循环或遍历. for i in range(len(a)):print(a[i]) 但当我们用得正嗨时,可能突然看到其他 ...
- Python中range函数的使用方法
Python中range函数的使用方法 更新时间:2022年05月30日 11:38:15 作者:Python编程学习圈 这篇文章主要介绍了Python中range函数的使用方法,文章基于Pyth ...
- range函数python-Python|range函数用法完全解读
迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成迭 ...
最新文章
- 用专业的说一句情话 计算机,用电脑专业说一句情话
- 一份数学小白也能读懂的「马尔可夫链蒙特卡洛方法」入门指南
- Maven命令行使用:mvn clean install(安装)
- (五)Cisco dhcp snooping实例3-多交换机环境(DHCP服务器和DHCP客户端位于同VLAN)...
- “约见”面试官系列之常见面试题第二十三篇之get和post区别(建议收藏)
- C# USB设备的管理(Devcon和注册表的USB操作)
- Cocos2d-Lua 输出脚本预编译错误产生位置
- 小白用GitHub快速搭建自己的网站,可访问,不用买域名、服务器
- 关于软件工程的课程建议
- POJ 1300 Door Man 欧拉路的判断
- 博时基金的大数据平台建设之道
- linux上chrome、vlc等程序root不能运行的解决办法
- Zookeeeper开源客户端curator watcherAPI的使用
- 新版Edge浏览器如何设置崩溃自动恢复网页
- 怎样制作传奇私服服务器,新手传奇gm必须学会如何制作传奇私服小地图
- 微信小程序作品集实例:跨页面传参,数据库,换行,空格,css
- 小米盒子打开adb调试模式
- Qt QString().sprintf(“%x“)解决打印无符号十六位数
- 数组18—push() :将一个或多个元素添加到数组的末尾
- 集合框架(一)——概述