鑒于上一篇中最后三個問題:
1、上述程式是否能進行優化(比如功能相同的)
2、創建三個3個實體,用了3個陳述句,能否建一個函式,只輸入一個數n,就自動創建n個實體?同時,每個實體的num_times隨機,(n比較大時,num_times應該比較小)
3、當實作上述功能后,程式運行,只輸入一個引數(創建實體的個數),就會自動生成對應的num_times,并分別呼叫相關函式生成對應圖表,
可以,在類Rand_moving()中計算每一步的方向和移動位置時,都用到了一個乘法公式,
x_direction = choice([1,-1]) #x的移動方向,1向上,0不變,-1向下 x_distance = choice([0,1,2,3,4,5]) #x的每次移動的像素, x_step = x_direction*x_distance #移動方向乘以移動距離,以確定沿x移動的距離 y_direction = choice([1,-1]) #y的移動方向,1向上,0不變,-1向下 y_distance = choice([0,1,2,3,4,5]) #y的每次移動的像素, y_step = y_direction*y_distance #移動方向乘以移動距離,以確定沿y移動的距離
因此可以整理出一個計算方法,可以直接呼叫,至于2,3很明顯,也是可以完成的,
第一步,將乘法公式提出來單獨形成一個作用于自身的方法,代碼如下:
def get_step(self,direction,distance): return distance*direction def fill_moving(self): while len(self.x_values)<self.num_times:#回圈不斷運行,直到漫步包含所需數量的點num_times x_step = self.get_step(choice([1,-1]),choice([0,1,2,3,4,5])) #直接呼叫get_step方法,使代碼更加簡潔 y_step = self.get_step(choice([1,-1]),choice([0,1,2,3,4,5]))
完成第1問,代碼變得更加簡潔明了,
第2、3個問題:
1)要能生成實體個數n,且還有對應的移動次數num_times,可考慮用字典,即實體個數為key,對應移動次數num_times為鍵值,當輸入2時,如 caselist={’1‘:'150000',’2‘:'250000'}
2)讀取字典每個專案,將對應的key和value傳遞給由Rand_moving類創建的實體,key的個數即為需要創建實體的個數,對應的value值為移動次數,
3)輸入數字,即為字典key的個數,存入字典,同時利用隨機函式生成一個num_times保存到對應的value中,
完成思路:
1,重新定義一個類 New_case() 作用:接收一個資料,并根據這個資料自動生成一個字典,
class New_case(): #定義New_case類 def __init__(self,numbers): #定義要創建的實體個數 self.numbers=numbers self.caselist={} #定義一個空的caselist字典 self.case = 0 while self.case < self.numbers: #當變數case小于給定值時, self.case += 1 times = choice([100000,150000,200000,250000])#隨機選擇一個移動次數 self.caselist[self.case] = times #將value與key對應
2、需要回圈讀取字典的key和value,并將value傳遞給類Rand_moving,隨后再運行fill_moving()生成資料并保存到串列,隨即用plt.scatter()進行繪圖
for key,value in self.caselist.items(): #字典不為空 colorkey=str(key) # 將字典關鍵字轉為字串存到變數colorkey中 examplecase = Rand_moving(int(value)) #創建實體,將對應的value值傳遞類Rand_moving examplecase.fill_moving() #呼叫類Rand_moving中的方法fill_moving()計算移動相關資料并保存到串列中 plt.figure(dpi=128,figsize=(12, 10)) #創建畫面螢屏 plt.scatter(examplecase.x_values,examplecase.y_values,c=self.colors[colorkey],s=15) plt.show()
上篇中的代碼 c=y_values, cmap=plt.cm.Reds為什么這里不再用,是因為這里回圈的時候一直出現紅色Reds,為了對比,創建了一新字典colors{},將生成的個數與顏色相對應,所以上述代碼中修改為 c=self.colors[colorkey]
類New_case() 全部代碼如下:
import matplotlib.pyplot as plt from rand_moving import * class New_case(): #定義New_case類 def __init__(self,numbers): #定義要創建的實體個數 self.numbers=numbers self.caselist={} #定義一個空的cases串列 self.case = 0 #定義一個case變數 self.colors={'1':'red','2':'orange','3':'yellow','4':'green','5':'blue','6':'puple'}#創建了一新字典colors{},將生成的個數與顏色相對應 while self.case < self.numbers: #小于給定實體個數時 self.case += 1 times = choice([100000,150000,200000,250000]) #隨機生成一個移動次數 self.caselist[self.case] = times #將變數case作為key, times作為value保存到字典中 def case_moving(self): #重新定義一個方法,即訪問字典所有項 for key,value in self.caselist.items(): #字典不為空 colorkey=str(key) # 將字典關鍵字轉為字串存到變數colorkey中 examplecase = Rand_moving(int(value)) #創建實體,將對應的value值傳遞類Rand_moving examplecase.fill_moving() #呼叫類Rand_moving中的方法fill_moving()計算移動相關資料并保存到串列中 plt.figure(dpi=128,figsize=(12, 10)) #創建畫面螢屏 plt.scatter(examplecase.x_values,examplecase.y_values,c=self.colors[colorkey],s=15)#注意呼叫了上述新字典的顏色 plt.show()
3、主程式
主程式中有一個互動,需要輸入一個資料,然后呼叫相關相關類創建實體(慢慢成調包俠了!^v^)
import matplotlib.pyplot as plt from rand_moving import * from new_case import * print("Please enter the number:") #互動,請輸入一個數,模擬運行,不需要太大的資料, n = input() #將輸入的資料保存到變數n中,注意所有輸入均為字串, testcase = New_case(int(n)) #將n轉為整型資料,創建實體個數 testcase.case_moving()
實際運行效果,輸入4,生成4個資料圖形(為展示較全,原圖已縮小):

self.colors={'1':'red','2':'orange','3':'yellow','4':'green','5':'blue','6':'puple'} 注意:圖的顏色分別與colors字典中對應,
當然如果覺得數軸很礙眼,那就在類類New_case() 中的plt.figure()之后加上
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/464035.html
標籤:Python
上一篇:Python爬取某短視頻熱點
