牟曉東
眾所周知,在Python中可構(gòu)造“for i in range(100):”語(yǔ)句來(lái)執(zhí)行100次循環(huán),因?yàn)椤皉ange(100)”就相當(dāng)于“range(0,100,1)”,是以1為步長(zhǎng)、左閉(包括0)右開(不包括100)的;如果在該循環(huán)中被執(zhí)行的語(yǔ)句是“print(i,end=‘ )”的話,那就會(huì)打印輸出0、1、2……98、99共100個(gè)整數(shù)。按照這個(gè)辦法是否可以使用range()函數(shù)來(lái)生成類似的均勻浮點(diǎn)數(shù)呢?比如0.00、0.01、0.02……0.98、0.99共100個(gè)浮點(diǎn)數(shù)。如果直接構(gòu)造“for i in range(0,1,0.01):”,Python就會(huì)給出“TypeError: ‘float object cannot be interpreted as an integer”的錯(cuò)誤提示,意思是“類型錯(cuò)誤:浮點(diǎn)型對(duì)象不能解釋為整數(shù)型”,因?yàn)閞ange()函數(shù)接收的參數(shù)必須是整數(shù)(可以是負(fù)數(shù)),而不能直接處理float浮點(diǎn)數(shù)。那么,如何解決均勻浮點(diǎn)數(shù)生成問(wèn)題呢?
方法1:while循環(huán)控制變量i自增
首先建立并給變量i賦值為0.00;接著構(gòu)造“while i <= 1.00:”循環(huán),其中的第一條語(yǔ)句為“print(‘%.2f%i,end=‘ )”,即以一個(gè)空格分隔并保留兩位小數(shù)輸出變量i的值;第二條語(yǔ)句為“i += 0.01”,即控制i的自增,步長(zhǎng)為0.01。運(yùn)行程序,得到了從0.00到0.99共100個(gè)均勻浮點(diǎn)數(shù)(如圖1)。
方法2:使用列表推導(dǎo)式
Python的列表推導(dǎo)式非常靈活,能夠以非常簡(jiǎn)潔的方式來(lái)快速生成滿足特定需求的列表。比如直接使用一條“my_list = [i/100 for i in range(100)]”語(yǔ)句,即可在列表my_list中得到符合要求的100個(gè)浮點(diǎn)數(shù),其實(shí)就是將“for i in range(100)”所得到的0-99分別進(jìn)行了“i/100”的計(jì)算。最后再使用for循環(huán)以同樣的方式來(lái)打印輸出,同樣也得到了100個(gè)均勻浮點(diǎn)數(shù),print中的“‘%.2f%”表示顯示保留兩位小數(shù)的浮點(diǎn)數(shù)(如圖2)。
方法3:借用numpy庫(kù)中的arange()
numpy庫(kù)中有個(gè)與Python的range()函數(shù)功能類似的arange(),但它支持浮點(diǎn)數(shù)運(yùn)算且使用方法類似,一樣是“初始值、終值、步長(zhǎng)”參數(shù)調(diào)用。在使用“import numpy as np”語(yǔ)句以np為別名導(dǎo)入numpy庫(kù)之后,再使用“my_list = list(np.arange(0,1,0.01))”語(yǔ)句,即可將arange()生成的ndarray數(shù)組對(duì)象轉(zhuǎn)換為列表數(shù)據(jù)。最后,使用for循環(huán)打印輸出my_list中的所有元素,就得到了100個(gè)均勻浮點(diǎn)數(shù),本次保留3位小數(shù)(如圖3)。
方法4:自定義函數(shù)使用yield表達(dá)式
既然Python內(nèi)置的range()函數(shù)不提供對(duì)浮點(diǎn)數(shù)的運(yùn)算,那我們就可以自定義一個(gè)float_data()函數(shù),三個(gè)參數(shù)依次為start、end和step,同樣是對(duì)應(yīng)“初始值、終值、步長(zhǎng)”。函數(shù)中使用變量i來(lái)接收初始值,然后通過(guò)while循環(huán)(當(dāng)i 在主程序中調(diào)用float_data()函數(shù),接收到的數(shù)據(jù)存儲(chǔ)至變量my_generator中,最后仍然是通過(guò)for循環(huán)來(lái)將它們打印輸出,也可以得到100個(gè)均勻浮點(diǎn)數(shù)(如圖4)。
四種方法均能實(shí)現(xiàn)均勻浮點(diǎn)數(shù)的生成,大家可根據(jù)自己的編程習(xí)慣來(lái)使用。當(dāng)然,如果想生成的是0.000、0.001、0.002……0.999這樣的千分位均勻浮點(diǎn)數(shù),只要在程序中將步長(zhǎng)修改為0.001、print輸出“%.3f”以及方法2中將“i/100”修改為“i/1000”即可。