牟曉東
眾所周知,在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”即可。