首页 > 解决方案 > 如何优化 for 循环 - Python 3

问题描述

第一次发帖,如有错误请见谅!

我正在搞乱 pygame 库,而且我对 python 非常陌生。我创建了 3 个敌人类,它们按预期工作,但是,这就是我让它们移动的方式(我调用存储在类中的移动函数)。

我想知道是否有更干净的方式来做事。我还有很多其他的敌人要编码,而且这看起来很重复,所以这是我做错了什么的迹象。

我尝试创建一个“控制列表”,在其中列出所有敌人列表,并尝试通过它们的索引访问它们,但它不起作用。我也尝试连接,但我收到一个错误,说我无法连接列表名称,另一个错误是我的列表名称变成了字符串(是的,我尝试使用引号)。我敢肯定这将是一个简单的修复,但我花了 3 天的时间来解决它。如果可以的话

到目前为止我的代码示例 - 它位于我的游戏的主运行循环中。

    for giant in lst_enemy_giants:
        giant.move()
    else:
        pass

    for spider in lst_enemy_spiders:
        spider.move()
    else:
        pass

    for goblin in lst_enemy_goblin:
        giant.move()
    else:
        pass

# The pattern the I want
    for ENEMY in lst_enemy_ENEMY:
        ENEMY.move()

# where ENEMY is any enemy list that can be stored somewhere

标签: pythonlistpygame

解决方案


只需将迭代器链接在一起。

from itertools import chain

for enemy in chain(lst_enemy_giants, lst_enemy_spiders, lst_enemy_goblin):
    enemy.move()

这是编写嵌套循环的一种更好的方法,例如

for enemy_list in [lst_enemy_giants, lst_enemy_spiders, lst_enemy_goblin]:
    for enemy in enemy_list:
        enemy.move()

不相关,但我建议保留一个像

enemies = {'giants': [...], 'spiders': [...], 'goblins': [...]}

而不是三个单独的变量引用单独的列表。例如,您仍然可以enemies['giants']在任何您曾经使用过的地方使用lst_enemy_giants,但现在您可以编写

for enemy in chain(*enemies.values()):
    enemy.move()

推荐阅读