2014-01-17 41 views
0

所以我有這個叫做risar的模塊。它做了什麼,它吸引了什麼。但這並不重要。我寫了這個代碼,在背景上設置了20朵花。該代碼的作品,但它看起來非常尷尬。我希望它看起來更「花俏」,或者可能會使用更少的循環。我對python比較陌生。相同但沒有循環

import risar 
import random 


def makeFlowers(): 
    flowers = [] 
    for i in range(5): 
     colors = ["black_flower.svg","blue_flower.svg", "brown_flower.svg", "green_flower.svg","purple_flower.svg"] 
     for j in range(4): 
      x = random.randint(20, (risar.maxX-20)) 
      y = random.randint(20, 300) 
      flower = risar.picture(x, y, colors[i]) 
      flowers.append(flower) 
    return flowers 

flowers = makeFlowers() 
+0

因子出'顏色',因爲它保持不變。 – arshajii

+5

這個問題似乎與題外話題,因爲它是關於代碼審查。應該在代碼審查stackexchange網站(http://codereview.stackexchange.com/)。 –

+0

我不知道存在。謝謝你讓我知道,欣賞它,一定會使用它! xD – Doe

回答

2

那麼對於初學者,你設置color變量相同的列表,五次,這樣你就可以從循環刪除:

# Just set `colors` once 
colors = ["black_flower.svg","blue_flower.svg", "brown_flower.svg","green_flower.svg","purple_flower.svg"] 
for i in range(5): 
    # Do stuff 

其次,你使用兩個循環無緣無故。提示:如果你沒有使用j作任何事情,它可能不配有它自己的循環。

取而代之,將您想要一起重複的代碼拉出,然後多次重複。在這種情況下,你想重複你的代碼塊二十次,但是你只是使用嵌套循環來確保你旋轉了顏色。相反,我們看到的花,你正在繪製的數量整除的顏色列表的長度,並重構了整個事情變成一個循環:

for i in range(20): 
    x = random.randint(20, (risar.maxX-20)) 
    y = random.randint(20, 300) 
    flower = risar.picture(x, y, colors[i//4]) # 0, 0, 0, 0, 1, 1, 1, 1, etc... 
    flowers.append(flower) 
+0

看到我的顯式無循環重寫更好的方法,我只需更換xrange函數的範圍 – rekiem87

+0

@ rekiem87從'xrange'和'range'在20-項目循環極其微小。另外,OP沒有指定Python版本,Python3中的'range'與Python 2中的'xrange'一樣工作(並且'xrange'不再存在!) –

1

喜歡的東西

colors = ["black_flower.svg","blue_flower.svg", "brown_flower.svg", "green_flower.svg","purple_flower.svg"] 
for color in colors: 
    //You can do your second for here, no need to redeclare colors in each for, and color will be taking each value of the array 

而就還有一件事,你最好使用

xrange(limit) 

不同的是,x範圍是更有效,因爲不會產生號碼列表,只是一個序列發生器,這是沉重的MEM非常重要ory程序,就像繪畫一樣