四种Python均匀浮点数生成方法

2021-07-01 08:26牟晓东
电脑报 2021年11期
关键词:步长列表语句

牟晓东

众所周知,在Python中可构造“for i in range(100):”语句来执行100次循环,因为“range(100)”就相当于“range(0,100,1)”,是以1为步长、左闭(包括0)右开(不包括100)的;如果在该循环中被执行的语句是“print(i,end=‘ )”的话,那就会打印输出0、1、2……98、99共100个整数。按照这个办法是否可以使用range()函数来生成类似的均匀浮点数呢?比如0.00、0.01、0.02……0.98、0.99共100个浮点数。如果直接构造“for i in range(0,1,0.01):”,Python就会给出“TypeError: ‘float object cannot be interpreted as an integer”的错误提示,意思是“类型错误:浮点型对象不能解释为整数型”,因为range()函数接收的参数必须是整数(可以是负数),而不能直接处理float浮点数。那么,如何解决均匀浮点数生成问题呢?

方法1:while循环控制变量i自增

首先建立并给变量i赋值为0.00;接着构造“while i <= 1.00:”循环,其中的第一条语句为“print(‘%.2f%i,end=‘ )”,即以一个空格分隔并保留两位小数输出变量i的值;第二条语句为“i += 0.01”,即控制i的自增,步长为0.01。运行程序,得到了从0.00到0.99共100个均匀浮点数(如图1)。

方法2:使用列表推导式

Python的列表推导式非常灵活,能够以非常简洁的方式来快速生成满足特定需求的列表。比如直接使用一条“my_list = [i/100 for i in range(100)]”语句,即可在列表my_list中得到符合要求的100个浮点数,其实就是将“for i in range(100)”所得到的0-99分别进行了“i/100”的计算。最后再使用for循环以同样的方式来打印输出,同样也得到了100个均匀浮点数,print中的“‘%.2f%”表示显示保留两位小数的浮点数(如图2)。

方法3:借用numpy庫中的arange()

numpy库中有个与Python的range()函数功能类似的arange(),但它支持浮点数运算且使用方法类似,一样是“初始值、终值、步长”参数调用。在使用“import numpy as np”语句以np为别名导入numpy库之后,再使用“my_list = list(np.arange(0,1,0.01))”语句,即可将arange()生成的ndarray数组对象转换为列表数据。最后,使用for循环打印输出my_list中的所有元素,就得到了100个均匀浮点数,本次保留3位小数(如图3)。

方法4:自定义函数使用yield表达式

既然Python内置的range()函数不提供对浮点数的运算,那我们就可以自定义一个float_data()函数,三个参数依次为start、end和step,同样是对应“初始值、终值、步长”。函数中使用变量i来接收初始值,然后通过while循环(当i

在主程序中调用float_data()函数,接收到的数据存储至变量my_generator中,最后仍然是通过for循环来将它们打印输出,也可以得到100个均匀浮点数(如图4)。

四种方法均能实现均匀浮点数的生成,大家可根据自己的编程习惯来使用。当然,如果想生成的是0.000、0.001、0.002……0.999这样的千分位均匀浮点数,只要在程序中将步长修改为0.001、print输出“%.3f”以及方法2中将“i/100”修改为“i/1000”即可。

猜你喜欢
步长列表语句
扩列吧
董事长发开脱声明,无助消除步长困境
步长制药50亿元商誉肥了谁?
步长制药50亿元商誉肥了谁?
起底步长制药
列表法解分式方程问题探索
列表画树状图各有所长
基本算法语句
我喜欢
2011年《小说月刊》转载列表