2013-10-04 5 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() 

Класс Offspring является simple вида и должен умереть в возрасте 750 или выше - в идеале на 750 точно, но это часть проблемы. Я не понял, как перебирать список объектов (petri_dish) и, в любой момент итерации, удалять определенные объекты, независимо от того, находятся они в status = 0 (мертвые) или имеют достаточно возраст.

Извините, если это упрощенный вопрос, но петли - это не мой сильный костюм ... Я читал об этом и понимал, но любой дополнительный материал был бы оценен. Не говоря уже о ответе на мой вопрос! Большое спасибо.

+0

является 'turn' глобальной переменной? также, можете ли вы сократить свой код до минимального, что необходимо для воспроизведения проблемы? в настоящее время вы даже не указали соответствующие строки в коде. –

+3

Я вижу, что вы тестируете «x.species ==» species »и x.age> = 750', но, похоже, для вашего класса это« просто ». Кажется, эта часть теста будет всегда терпеть неудачу. Боковое примечание. Некоторые из ваших строк очень долго заставляют ваш код читать. Кроме того, вы создаете класс в функции, которая вызывается повторно. Вы уверены, что не хотите, чтобы этот класс жил на верхнем уровне? –

+0

Спасибо, Стивен! Это была глупая ошибка с моей стороны. Я пересмотрю свой код и попробую переместить класс Offspring на верхний уровень. Благодаря тонну! – userNaN

ответ

1

Одна вещь, которая может быть или не может быть предназначена: при передаче списка в список() копия списка возвращается (http://docs.python.org/2/library/functions.html#list). Поэтому, когда вы делаете для x в списке (petri_dish), вы получаете элементы из копии своего списка, а не ваш фактический список.

Причина, по которой я упоминаю об этом, заключается в том, что первая строка кода в цикле for - x.age + = 1. Это НЕ увеличивает возраст элементов в вашем списке petri_dish. Поскольку вы используете возраст как определяющий элемент для удаления элементов из списка, это кажется проблемой.

+0

Не беспокойтесь; Я фактически переключил свой список на понимание списка. '[y для y в petri_dish, если y.status == 1 и ((y.species == 'simple' и y.age <750) или (y.species == 'predator' и y.age <3000)) ] ' – userNaN

+2

Это решение проблемы с циклом? Кроме того, я бы предложил сделать некоторые константы для некоторых переменных значений, которые выглядят одинаковыми во всей вашей программе (например, имена «простых» или «хищников» и 750 и 3000 для времени смерти). Просто такие простые вещи, как simple_death_time = 750, predator_species_name = 'хищник. Это упростит обслуживание, поскольку вы возитесь с вещами (и облегчите другим чтение вашего кода, если вам придется снова писать здесь, прося о помощи). – Oniofchaos

Смежные вопросы