是否有一个Python相当于bash脚本中的严重重音?

时间:2011-09-17 11:53:48

标签: python bash variables dynamic replace

我不喜欢使用很多IF语句。以下是我现在正在玩的东西,在必须使用大量IF语句来完成它的过程中:

首先,一些变量......

pick_level = 1
lockpicking_level1_maxxp = 40
lockpicking_level2_maxxp = 70
lockpicking_level3_maxxp = 100

现在我们开始选择锁定。当选择1和任何直到当前开锁技能等级的最大xp除以2之间的任意数字时,会发生成功的选择。所以对于1级,它是1到20之间的任何东西 - 2级,1到35之间的任何东西,以及3到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,而不必一遍又一遍地询问同一个问题。它会像这样下去(使用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语句?

我想我可以使用dict,因为:

lockpicking_maxxp = {1:20, 2:35, 3:50}
...
if x in range(1, lockpicking_maxxp[pick_level]):

...但我不知道这是否正是我将如何设置我的技能数据库(尽管可能最终成为JSON文件。我喜欢JSON。)< / p>

非常感谢你的时间。我期待着更多地了解这个想法。

3 个答案:

答案 0 :(得分:4)

Don't repeat yourself。尽可能使用数据结构而不是单个对象:

lockpicking_maxxp = {
    1: 40,
    2: 70,
    3: 100
}

x = random.randint(1, 100)
if x > lockpicking_maxxp[pick_level] / 2:
    print 'You failed to pick the lock'
    ...

当然,你可能在这个游戏中有其他技能,所以你可能想要更像的东西:

maxxp = {
    'lockpicking': {
        1: 40,
        2: 70,
        3: 100
    }, 'trap_searching': {
        1: 50,
        ...
    }, ...
}

skill = 'lockpicking'
x = random.randint(1, 100)
if x > maxxp[skill][level[skill]] / 2:
    print 'You failed to pick the lock'
    ...

答案 1 :(得分:2)

您可以使用locals()将本地符号表作为dict并使用它来获取变量值。即:

>>> pick_level = 1
>>> lockpicking_level1_maxxp = 40
>>> lockpicking_level2_maxxp = 70
>>> lockpicking_level3_maxxp = 100
>>> locals()["lockpicking_level%d_maxxp" % pick_level]
40

答案 2 :(得分:2)

每当您觉得需要为变量添加数字时,您应该只使用一个列表:

pick_level = 1
lockpicking_levels = [0,40, 70, 100]

test = random.randint(1, 100)

if test < lockpicking_levels[pick_level] / 2:
    print "you failed"
else:
    ...