2013-10-04 177 views
0

我有一個關於在Python中計算循環迭代的快速問題。我已經創建了每個迭代都會「老化」的對象,並且應該在某個特定年齡「死亡」,但有時他們活得更長。下面是我的程序的一個片段:計數循環迭代(Python)

def reproduce(): 
    class Offspring(Species): 
     def __init__(self,name,life,attack,move,location,status,species,age): 
      area = 1000 
      self.name = name 
      self.life = life 
      self.attack = attack 
      self.move = move 
      self.location = [random.randint(1,area),random.randint(1,area)] 
      self.status = 1 
      self.species = 'simple' 
      self.age = 1 
    for z in [y for y in petri_dish if y.status == 1 and y.life >= 50 and y.species == 'simple']: 
     petri_dish.append(Offspring('g' + str(turn/250)+'#'+str(z.name),(random.randint(int(z.life/2),z.life)),(random.randint(int(z.attack/2),z.attack)),(random.randint(int(z.move/2),z.move)),0,1,0,0)) 
     print 'g' + str(turn/250)+'#'+str(z.name), 'was born.' 
def move_around(): 
    for x in list(petri_dish): 
     x.age += 1 
     if x.status == 0 or (x.species == 'species' and x.age >= 750) or (x.species == 'predator' and x.age >= 3000): 
      print str(x.name) + ' expired. Cells left: ' + str(len(petri_dish))    
      petri_dish.remove(x) 
     else: 
      x.relocate() 
      x.target() 
      if len(petri_dish) >= 75: 
       for x in list(petri_dish): 
        if x.life < int(turn/25): 
         x.status = 0 
    if turn % 250 == 0: 
     reproduce() 

while len([y for y in petri_dish if y.status == 1]) > 1: 
    turn += 1  
    move_around() 

子孫類是simple物種在750歲或以上應該死 - 在750正是理想的,但是這是問題的一部分。我還沒有想出如何遍歷我的對象列表(petri_dish),並且在迭代中的任何時候,刪除某些對象,無論它們是在status = 0(死亡)還是已經過時。

對不起,如果這是一個簡單的問題,但循環不是我強大的西裝......我一直在閱讀理解等,但任何額外的材料也將不勝感激。更不用提我的問題了!非常感謝。

+0

是'turn'全局變量嗎?另外,您能否將您的代碼降低到最低限度,以便重現問題?目前,你甚至沒有在代碼中指出相關的行。 –

+3

我看到你正在測試'x.species =='物種'和x.age> = 750',但它似乎在你的班級中設置爲'simple'。看起來這部分測試總是失敗。附註:您的一些行很長,使您的代碼難以閱讀。另外,你正在一個函數中創建一個類,這個函數會被重複調用。你確定你不想讓這個班級生活在頂層嗎? –

+0

謝謝史蒂文!這是我的一個愚蠢的錯誤。我將修改我的代碼並嘗試將Offspring類移到頂層。萬分感謝! – userNaN

回答

1

有一件事可能會也可能不會:當您將一個列表傳遞給list()時,將返回該列表的一個副本(http://docs.python.org/2/library/functions.html#list)。所以當你在list(petri_dish)中使用x時,你從列表副本中獲取元素,而不是你的實際列表。

我之所以提到這個問題,是因爲for循環中的第一行代碼是x.age + = 1。這不會增加petri_dish列表中項目的年齡。由於您使用年齡作爲從列表中刪除項目的決定因素,這似乎是一個問題。

+0

不用擔心;我實際上將我的列表轉換爲列表理解。 (如果y.status == 1和((y.species =='simple'和y.age <750)或(y.species =='predator'和y.age <3000)),則[y for petri_dish ]' – userNaN

+2

這是否解決了循環問題?另外,我建議爲一些變量值做一些常量,這些變量值在整個程序中保持不變(比如「簡單」或「捕食者」物種名稱,死亡時間爲750和3000)。只是簡單的事情,如simple_death_time = 750,predator_species_name ='捕食者'。當你修改東西時,它會使維護變得更容易(並且如果你必須在這裏再次發佈請求幫助,它將使其他人更容易閱讀你的代碼)。 – Oniofchaos