Python中是否有类似于bash脚本中的反引号?

0 投票
3 回答
887 浏览
提问于 2025-04-17 02:29

我不太喜欢用很多IF语句。现在我在尝试一种方法,尽量减少使用IF语句来完成我的任务:

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

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

接下来是开锁的部分。成功开锁的条件是随机选择一个数字,这个数字在1到当前开锁技能等级的最大经验值的一半之间。例如,等级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的值来确定经验值,而不是重复写很多IF语句。可以这样写(用反引号,就像在bash中一样):

if x not in range(1, (lockpicking_level`pick_level`_maxxp / 2)):

这样,我就可以避免所有的IF语句,代码会根据pick_level的值自动变成'lockpicking_level1_maxxp'、'lockpicking_level2_maxxp'或'lockpicking_level3_maxxp'。

不过我已经有一段时间没写bash脚本了,所以对它的记忆可能有点模糊。而且我知道在Python 3之前,``的用法和使用repr()基本相同,所以那样不太对。有没有什么方法可以实现这个,还是我只能到处写丑陋的IF语句呢?

我想我可以用字典来实现,比如:

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

...但我不确定这是否就是我设置技能数据库的方式(虽然它最终可能会是一个JSON文件。我喜欢JSON。)

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

3 个回答

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:
    ...
4

不要重复自己。尽量使用数据结构,而不是单独的对象。

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'
    ...
2

你可以使用 locals() 这个函数来获取当前作用域内的所有变量和它们的值,返回的结果是一个字典(就像一个键值对的列表)。这样你就可以通过这个字典来获取某个变量的值。比如:

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

撰写回答