牟晓东
众所周知,在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”即可。