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 函数相关推荐

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

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

  2. 自定义 C++ 中的 range() 函数

    在 Python 生成连续的可迭代的序列,常用十分 convenient 的 range()函数(包含左端点,不包含右端点): # Python >>> range(5) range ...

  3. python自定义一个函数求序列中的偶数_使用range函数创建一个从2到10的偶数列表 alist...

    [多选题]在Python中添加注释可以使用哪些符号? [简答题]给定一个包含若干个整数的列表alist,要求返回输出列表blist,blist中的元素为 与alist对应位置上的元素之外其余各元素的乘 ...

  4. python开发_python中的range()函数

    python中的range()函数的功能hen强大,所以我觉得很有必要和大家分享一下 就好像其API中所描述的: If you do need to iterate over a sequence o ...

  5. [转载] Python|range函数用法完全解读

    参考链接: Python | range()不返回迭代器 迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代 ...

  6. Python|range函数用法完全解读

    迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成迭 ...

  7. Python中的range函数和arange函数的区别与联系

    [问题发现] 相信很多使用Python的小伙伴,都用到过range()函数,进行循环或遍历. for i in range(len(a)):print(a[i]) 但当我们用得正嗨时,可能突然看到其他 ...

  8. Python中range函数的使用方法

    Python中range函数的使用方法 更新时间:2022年05月30日 11:38:15   作者:Python编程学习圈 这篇文章主要介绍了Python中range函数的使用方法,文章基于Pyth ...

  9. range函数python-Python|range函数用法完全解读

    迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成迭 ...

最新文章

  1. 用专业的说一句情话 计算机,用电脑专业说一句情话
  2. 一份数学小白也能读懂的「马尔可夫链蒙特卡洛方法」入门指南
  3. Maven命令行使用:mvn clean install(安装)
  4. (五)Cisco dhcp snooping实例3-多交换机环境(DHCP服务器和DHCP客户端位于同VLAN)...
  5. “约见”面试官系列之常见面试题第二十三篇之get和post区别(建议收藏)
  6. C# USB设备的管理(Devcon和注册表的USB操作)
  7. Cocos2d-Lua 输出脚本预编译错误产生位置
  8. 小白用GitHub快速搭建自己的网站,可访问,不用买域名、服务器
  9. 关于软件工程的课程建议
  10. POJ 1300 Door Man 欧拉路的判断
  11. 博时基金的大数据平台建设之道
  12. linux上chrome、vlc等程序root不能运行的解决办法
  13. Zookeeeper开源客户端curator watcherAPI的使用
  14. 新版Edge浏览器如何设置崩溃自动恢复网页
  15. 怎样制作传奇私服服务器,新手传奇gm必须学会如何制作传奇私服小地图
  16. 微信小程序作品集实例:跨页面传参,数据库,换行,空格,css
  17. 小米盒子打开adb调试模式
  18. Qt QString().sprintf(“%x“)解决打印无符号十六位数
  19. 数组18—push() :将一个或多个元素添加到数组的末尾
  20. 集合框架(一)——概述

热门文章

  1. 计算机网络7层协议,计算机网络七层协议
  2. 【前端开发】CSS BEM命名规范
  3. Java逻辑运算符取反操作
  4. 永远的伊苏 2 Mac版 | 适用于MacOS10.15系统的经典游戏《永远的伊苏 2》中文版
  5. Pr基础(音乐剪辑工具、练习)
  6. node--cors
  7. 京东商城刘强东:B2C业2012年一定会出事
  8. 小学三年级计算机认识鼠标说课,认识鼠标说课稿.doc
  9. tomcat启动失败问题
  10. 力扣:1106. 解析布尔表达式