这些类似的if语句如何写得更简洁呢?
How can these similar if statements be written more concisely?
这是 python 处理模式的代码片段。这段代码的目的是在按下一个键时更新一个变量。 Processing 有一个名为 keyPressed 的变量,如果按下某个键则该变量为 True。按下的键的标识以字符串形式保存在名为 key 的变量中。
if keyPressed:
if key == "a":
a += 0.1
elif key == "s":
a -= 0.1
elif key == "q":
q += 1
elif key == "w":
q -= 1
elif key == "z":
z += 3
elif key == "x":
z -= 3
这是最好的写法,还是有更好的写法?如果不是,如果有 100 个键,每个键都有不同的变量要调整怎么办?
没有办法绕过第一个 if 语句,但您可以用字典替换第二个 if 语句。
而加减法的区别就是对数取反
ops = {'a': (a, 0.1),
's': (a, -0.1),
'q': (q, 1),
'w': (q, -1),
'z': (z, 3),
'x': (z, -3)}
if keyPressed:
var, amount = ops[key]
var += amount
挑战在于 if 决定要更新哪个变量以及要添加到变量的值。可以通过 global()
命名空间调用按名称动态访问全局变量。我注意到一个键更新了一个同名变量,然后下一个键将同一个变量递减相同的量。因此,每个变量有 3 条信息。您可以将其放入列表(或元组)中,然后构建一个字典,告诉您每次按键时要执行的操作。
# var key, negated var key, value triplets
key_db = (("a", "s", .1), ("q", "w", 1), ("z", "x", 3))
key_index = {}
for var, nvar, val in key_db:
key_index[var] = (var, val)
key_index[nvar] = (var, -val)
if key_pressed:
try:
var, val = key_index[key]
globals()[var] = globals().get(var, 0) + val
except KeyError:
pass
这是 python 处理模式的代码片段。这段代码的目的是在按下一个键时更新一个变量。 Processing 有一个名为 keyPressed 的变量,如果按下某个键则该变量为 True。按下的键的标识以字符串形式保存在名为 key 的变量中。
if keyPressed:
if key == "a":
a += 0.1
elif key == "s":
a -= 0.1
elif key == "q":
q += 1
elif key == "w":
q -= 1
elif key == "z":
z += 3
elif key == "x":
z -= 3
这是最好的写法,还是有更好的写法?如果不是,如果有 100 个键,每个键都有不同的变量要调整怎么办?
没有办法绕过第一个 if 语句,但您可以用字典替换第二个 if 语句。
而加减法的区别就是对数取反
ops = {'a': (a, 0.1),
's': (a, -0.1),
'q': (q, 1),
'w': (q, -1),
'z': (z, 3),
'x': (z, -3)}
if keyPressed:
var, amount = ops[key]
var += amount
挑战在于 if 决定要更新哪个变量以及要添加到变量的值。可以通过 global()
命名空间调用按名称动态访问全局变量。我注意到一个键更新了一个同名变量,然后下一个键将同一个变量递减相同的量。因此,每个变量有 3 条信息。您可以将其放入列表(或元组)中,然后构建一个字典,告诉您每次按键时要执行的操作。
# var key, negated var key, value triplets
key_db = (("a", "s", .1), ("q", "w", 1), ("z", "x", 3))
key_index = {}
for var, nvar, val in key_db:
key_index[var] = (var, val)
key_index[nvar] = (var, -val)
if key_pressed:
try:
var, val = key_index[key]
globals()[var] = globals().get(var, 0) + val
except KeyError:
pass