首页 > 解决方案 > 有没有更有效的方法在 python 中编写一个非常长的“if elif”链?

问题描述

我是真正的编程语言的初学者,我正在使用 Python 编写一个长的 if elif 链来检查 x 和 y 变量作为坐标,并且根据坐标它会做一些不同的事情。(这是一个基于文本的冒险游戏)

这就是我现在所拥有的,我想知道如何以更好的方式做到这一点。

if x == 1 and y == 1:
    dothis()
elif x == 1 and y == 2:
    dothat()
elif x == 1 and y == 3:
    doANewThing()
elif x == 1 and y == 3:
    doSomethingDif()

除了这个出现超过 900 次。我恨它。请帮忙。

标签: pythonif-statementoptimizationcomputer-science

解决方案


我猜测每个案例代表游戏中的不同房间,并且您想为每个房间调用不同的函数。

一个很好的模式是将数据与代码分开。将每个房间的坐标和功能视为数据,将它们提取到某种房间列表中。代码只需要检查玩家的坐标,找到相应的房间函数,然后调用它。

数据

字典非常适​​合查找内容。让我们将 x,y 坐标视为键,将函数视为值。

rooms = {
    (1, 1): dothis,
    (1, 2): dothat,
    (1, 3): doANewThing,
    (1, 4): doSomethingDif,
    # etc.
}

注意函数名称后面没有括号。是dothisdothat,不是dothis()dothat()。我们在这里只列出函数的名称;我们实际上并没有打电话给他们。

代码

try:
    # Look up the function for the current room...
    room_function = rooms[(x, y)]

    # ...And call it.
    room_function()

# Error! Didn't find an entry for (x, y).
except KeyError:
    handle_error()

这样做的好处是您可以轻松地将新房间添加到字典中,而无需编写任何新的 if-else 块。事实上,没有if-else 块!


推荐阅读