python - 有没有更有效的方法在 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 次。我恨它。请帮忙。
解决方案
我猜测每个案例代表游戏中的不同房间,并且您想为每个房间调用不同的函数。
一个很好的模式是将数据与代码分开。将每个房间的坐标和功能视为数据,将它们提取到某种房间列表中。代码只需要检查玩家的坐标,找到相应的房间函数,然后调用它。
数据
字典非常适合查找内容。让我们将 x,y 坐标视为键,将函数视为值。
rooms = {
(1, 1): dothis,
(1, 2): dothat,
(1, 3): doANewThing,
(1, 4): doSomethingDif,
# etc.
}
注意函数名称后面没有括号。是dothis
和dothat
,不是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 块!
推荐阅读
- python - VS Code 调试导致 Python 子进程挂起
- python - 如何将一列拆分为三列?
- python - Python + Pandas:无需迭代的 DataFrame 计算
- android - 过渡管理器延迟过渡不适用于android中的多个视图
- python - 使用斐波那契:暂停执行并从它停止的地方开始的 Python 函数
- reactjs - 异步函数返回承诺对象而不是返回布尔值(reactjs Hooks)
- react-native - 如何在登录屏幕中隐藏底部标签导航?
- r - 如何从 Landsat 图像中提取值并在 R 中绘制不同材料的光谱剖面
- kubernetes - 使用其他属性更新 helm 图表
- javascript - Wordpress 自定义 JS 位置