2014-02-04 3 views
0

Я пишу игру и в while True: loop У меня есть код, перерисовывающий состояние игры.Итерации по нескольким спискам (без снижения производительности)

У меня есть несколько списков объектов разного типа (космические корабли, лучи, звезды) - все для повышения производительности.

И мне нужно нарисовать их все. Я мог бы сделать:

for spaceship in spaceships: 
    screen.blit(spaceship.image, (spaceship.x, spaceship.y)) 
for beam in beams: 
    screen.blit(beam.image, (beam.x, beam.y)) 
... 

но я чувствую, что это как-то против принципа СУХОЙ. И я просто чувствую, что это можно сделать лучше.

Что мне нужно, это сооружение, как это:

for actor in spaceships + beams + stars: 
    actor.move() 
    screen.blit(actor.image, (actor.x, actor.y)) 

, но один, который бы не присоединиться к ним все (и не все, что бы уменьшить производительность). Ваши идеи?

ответ

6

Использование chain из itertools модуля:

from itertools import chain 
for actor in chain(spaceships, beams, stars): 
    actor.move() 
    screen.blit(actor.image, (actor.x, actor.y)) 

Из документов:

сделать итератор, который не возвращает элементы из первой итерации до она истощается, а затем переходит к следующей итерации , пока не будут исчерпаны все итерации . Используется для обработки последовательных последовательностей как одиночная последовательность .

chain использует ленивую оценку (например, не создаются промежуточные списки), поэтому не произойдет никакого снижения производительности.

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