我正在写一个游戏而在中,而True:循环我有一个重新绘制游戏状态的代码。
我有几个不同种类的物品清单(宇宙飞船,横梁,星星) - 所有这些都是为了提高性能。
我需要把它们都画出来。我能做到:
for spaceship in spaceships:
screen.blit(spaceship.image, (spaceship.x, spaceship.y))
for beam in beams:
screen.blit(beam.image, (beam.x, beam.y))
...
但我觉得这有点违背DRY原则。我觉得它可以做得更好。
我需要的是这样的结构:
for actor in spaceships + beams + stars:
actor.move()
screen.blit(actor.image, (actor.x, actor.y))
但是一个人不会加入他们(也不会做任何会降低性能的事情)。你的想法?
答案 0 :(得分:6)
使用itertools
模块中的chain
:
from itertools import chain
for actor in chain(spaceships, beams, stars):
actor.move()
screen.blit(actor.image, (actor.x, actor.y))
来自文档:
创建一个迭代器,返回第一个iterable中的元素,直到 它耗尽,然后进入下一个迭代,直到所有的 迭代用尽了。用于处理连续序列 单一序列。
chain
使用延迟评估(例如,没有创建中间列表),因此不会有任何性能下降。