您好,登錄后才能下訂單哦!
這篇“Python利用隨機(jī)函數(shù)生成變化圖形的方法”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python利用隨機(jī)函數(shù)生成變化圖形的方法”文章吧。
問題:
1、上述程序是否能進(jìn)行優(yōu)化(比如功能相同的)
2、創(chuàng)建三個(gè)3個(gè)實(shí)例,用了3個(gè)語句,能否建一個(gè)函數(shù),只輸入一個(gè)數(shù)n,就自動(dòng)創(chuàng)建n個(gè)實(shí)例?同時(shí),每個(gè)實(shí)例的num_times隨機(jī),(n比較大時(shí),num_times應(yīng)該比較小)
3、當(dāng)實(shí)現(xiàn)上述功能后,程序運(yùn)行,只輸入一個(gè)參數(shù)(創(chuàng)建實(shí)例的個(gè)數(shù)),就會(huì)自動(dòng)生成對(duì)應(yīng)的num_times,并分別調(diào)用相關(guān)函數(shù)生成對(duì)應(yīng)圖表。
可以,在類Rand_moving()中計(jì)算每一步的方向和移動(dòng)位置時(shí),都用到了一個(gè)乘法公式,
x_direction = choice([1,-1]) #x的移動(dòng)方向,1向上,0不變,-1向下 x_distance = choice([0,1,2,3,4,5]) #x的每次移動(dòng)的像素, x_step = x_direction*x_distance #移動(dòng)方向乘以移動(dòng)距離,以確定沿x移動(dòng)的距離 y_direction = choice([1,-1]) #y的移動(dòng)方向,1向上,0不變,-1向下 y_distance = choice([0,1,2,3,4,5]) #y的每次移動(dòng)的像素, y_step = y_direction*y_distance #移動(dòng)方向乘以移動(dòng)距離,以確定沿y移動(dòng)的距離
因此可以整理出一個(gè)計(jì)算方法,可以直接調(diào)用,至于2,3很明顯,也是可以完成的。
第一步,將乘法公式提出來單獨(dú)形成一個(gè)作用于自身的方法,代碼如下:
def get_step(self,direction,distance): return distance*direction def fill_moving(self): while len(self.x_values)<self.num_times:#循環(huán)不斷運(yùn)行,直到漫步包含所需數(shù)量的點(diǎn)num_times x_step = self.get_step(choice([1,-1]),choice([0,1,2,3,4,5])) #直接調(diào)用get_step方法,使代碼更加簡(jiǎn)潔 y_step = self.get_step(choice([1,-1]),choice([0,1,2,3,4,5]))
完成第1問,代碼變得更加簡(jiǎn)潔明了。
第2、3個(gè)問題:
1)要能生成實(shí)例個(gè)數(shù)n,且還有對(duì)應(yīng)的移動(dòng)次數(shù)num_times,可考慮用字典,即實(shí)例個(gè)數(shù)為key,對(duì)應(yīng)移動(dòng)次數(shù)num_times為鍵值,當(dāng)輸入2時(shí),如 caselist={’1‘:'150000',’2‘:'250000'}
2)讀取字典每個(gè)項(xiàng)目,將對(duì)應(yīng)的key和value傳遞給由Rand_moving類創(chuàng)建的實(shí)例,key的個(gè)數(shù)即為需要?jiǎng)?chuàng)建實(shí)例的個(gè)數(shù),對(duì)應(yīng)的value值為移動(dòng)次數(shù)。
3)輸入數(shù)字,即為字典key的個(gè)數(shù),存入字典,同時(shí)利用隨機(jī)函數(shù)生成一個(gè)num_times保存到對(duì)應(yīng)的value中。
完成思路:
1,重新定義一個(gè)類 New_case() 作用:接收一個(gè)數(shù)據(jù),并根據(jù)這個(gè)數(shù)據(jù)自動(dòng)生成一個(gè)字典,
class New_case(): #定義New_case類 def __init__(self,numbers): #定義要?jiǎng)?chuàng)建的實(shí)例個(gè)數(shù) self.numbers=numbers self.caselist={} #定義一個(gè)空的caselist字典 self.case = 0 while self.case < self.numbers: #當(dāng)變量case小于給定值時(shí), self.case += 1 times = choice([100000,150000,200000,250000])#隨機(jī)選擇一個(gè)移動(dòng)次數(shù) self.caselist[self.case] = times #將value與key對(duì)應(yīng)
2、需要循環(huán)讀取字典的key和value,并將value傳遞給類Rand_moving,隨后再運(yùn)行fill_moving()生成數(shù)據(jù)并保存到列表,隨即用plt.scatter()進(jìn)行繪圖
for key,value in self.caselist.items(): #字典不為空 colorkey=str(key) # 將字典關(guān)鍵字轉(zhuǎn)為字符串存到變量colorkey中 examplecase = Rand_moving(int(value)) #創(chuàng)建實(shí)例,將對(duì)應(yīng)的value值傳遞類Rand_moving examplecase.fill_moving() #調(diào)用類Rand_moving中的方法fill_moving()計(jì)算移動(dòng)相關(guān)數(shù)據(jù)并保存到列表中 plt.figure(dpi=128,figsize=(12, 10)) #創(chuàng)建畫面屏幕 plt.scatter(examplecase.x_values,examplecase.y_values,c=self.colors[colorkey],s=15) plt.show()
上篇中的代碼 c=y_values, cmap=plt.cm.Reds為什么這里不再用,是因?yàn)檫@里循環(huán)的時(shí)候一直出現(xiàn)紅色Reds,為了對(duì)比,創(chuàng)建了一新字典colors{},將生成的個(gè)數(shù)與顏色相對(duì)應(yīng)。所以上述代碼中修改為 c=self.colors[colorkey]
類New_case() 全部代碼如下:
import matplotlib.pyplot as plt from rand_moving import * class New_case(): #定義New_case類 def __init__(self,numbers): #定義要?jiǎng)?chuàng)建的實(shí)例個(gè)數(shù) self.numbers=numbers self.caselist={} #定義一個(gè)空的cases列表 self.case = 0 #定義一個(gè)case變量 self.colors={'1':'red','2':'orange','3':'yellow','4':'green','5':'blue','6':'puple'}#創(chuàng)建了一新字典colors{},將生成的個(gè)數(shù)與顏色相對(duì)應(yīng) while self.case < self.numbers: #小于給定實(shí)例個(gè)數(shù)時(shí) self.case += 1 times = choice([100000,150000,200000,250000]) #隨機(jī)生成一個(gè)移動(dòng)次數(shù) self.caselist[self.case] = times #將變量case作為key, times作為value保存到字典中 def case_moving(self): #重新定義一個(gè)方法,即訪問字典所有項(xiàng) for key,value in self.caselist.items(): #字典不為空 colorkey=str(key) # 將字典關(guān)鍵字轉(zhuǎn)為字符串存到變量colorkey中 examplecase = Rand_moving(int(value)) #創(chuàng)建實(shí)例,將對(duì)應(yīng)的value值傳遞類Rand_moving examplecase.fill_moving() #調(diào)用類Rand_moving中的方法fill_moving()計(jì)算移動(dòng)相關(guān)數(shù)據(jù)并保存到列表中 plt.figure(dpi=128,figsize=(12, 10)) #創(chuàng)建畫面屏幕 plt.scatter(examplecase.x_values,examplecase.y_values,c=self.colors[colorkey],s=15)#注意調(diào)用了上述新字典的顏色 plt.show()
3、主程序
主程序中有一個(gè)交互,需要輸入一個(gè)數(shù)據(jù),然后調(diào)用相關(guān)相關(guān)類創(chuàng)建實(shí)例(慢慢成調(diào)包俠了!^v^)
import matplotlib.pyplot as plt from rand_moving import * from new_case import * print("Please enter the number:") #交互,請(qǐng)輸入一個(gè)數(shù),模擬運(yùn)行,不需要太大的數(shù)據(jù)。 n = input() #將輸入的數(shù)據(jù)保存到變量n中,注意所有輸入均為字符串, testcase = New_case(int(n)) #將n轉(zhuǎn)為整型數(shù)據(jù),創(chuàng)建實(shí)例個(gè)數(shù) testcase.case_moving()
實(shí)際運(yùn)行效果,輸入4,生成4個(gè)數(shù)據(jù)圖形(為展示較全,原圖已縮小):
self.colors={'1':'red','2':'orange','3':'yellow','4':'green','5':'blue','6':'puple'} 注意:圖的顏色分別與colors字典中對(duì)應(yīng)。
當(dāng)然如果覺得數(shù)軸很礙眼,那就在類類New_case() 中的plt.figure()之后加上
plt.axes().get_xaxis().set_visible(False) plt.axes().get_yaxis().set_visible(False)
以上就是關(guān)于“Python利用隨機(jī)函數(shù)生成變化圖形的方法”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。