【发布时间】:2011-11-19 06:01:15
【问题描述】:
我不喜欢使用大量的 IF 语句。在不得不使用大量 IF 语句来完成它的世界中,这就是我现在正在玩的东西:
首先,一些变量...
pick_level = 1
lockpicking_level1_maxxp = 40
lockpicking_level2_maxxp = 70
lockpicking_level3_maxxp = 100
现在我们要开锁了。 A successful pick happens when a random number between 1 and anything up to the current lockpicking skill level's max xp divided by 2 is chosen.所以对于级别 1,它是介于 1 和 20 之间的任何值 - 级别 2,介于 1 和 35 之间的任何值,而级别 3 是介于 1 和 50 之间的任何值。下面是 IF 语句的样子:
x = random.randint(1, 100)
if pick_level == 1:
if x not in range(1, (lockpicking_level1_maxxp / 2)):
print 'You failed to pick the lock'
...
elif pick_level == 2:
if x not in range(1, (lockpicking_level2_maxxp / 2)):
etcetc
我想做的是根据 pick_level 的值确定 xp,而不必做一堆 IF 语句一遍又一遍地询问相同的问题。它会像这样(使用 bash 中的重音):
if x not in range(1, (lockpicking_level`pick_level`_maxxp / 2)):
通过这种方式,我可以根据 pick_level 的值让代码自动变为“lockpicking_level1_maxxp”、“lockpicking_level2_maxxp”或“lockpicking_level3_maxxp”,从而避免所有 IF 语句。
虽然我已经有一段时间没有编写 bash 脚本了,所以我对它的工作原理的记忆可能有点模糊。我也知道 `` 在 Python 版本 3 之前与使用 repr() 基本相同,所以这不是如何做到的。有什么办法可以做到这一点,还是我一直在写丑陋的 IF 语句?
我想我可以像这样使用字典:
lockpicking_maxxp = {1:20, 2:35, 3:50}
...
if x in range(1, lockpicking_maxxp[pick_level]):
...但我不知道这是否正是我设置技能数据库的方式(尽管它可能最终会成为 JSON 文件。我喜欢 JSON。)
非常感谢您的宝贵时间。我期待更多地了解这个想法。
【问题讨论】:
-
使用字典。任何相当于使用
eval的东西都是丑陋的,容易给出无用的错误,更难理解,最糟糕的是完全没有必要。 -
尝试阅读面向对象的编程。从长远来看,它将使处理更复杂的事情变得更加容易。 Shell/Bash 脚本只有原始数据结构,python 装备更好,dict 和 set 让生活变得更好。 eval() 和朋友在 shellscripts 中是可以的,但在干净的高级语言中,它被认为是不好的风格。但是不要让这阻止你,无论你怎么做,编程都是非常有趣的! :D
标签: python bash variables dynamic replace