Python 这些类似的if语句如何写得更简洁?
这是python处理模式的代码片段。此代码的目的是在按键时更新变量。处理有一个名为keyPressed的变量,如果按下某个键,该变量为True。按下的键的标识将作为字符串保存在名为key的变量中Python 这些类似的if语句如何写得更简洁?,python,logic,Python,Logic,这是python处理模式的代码片段。此代码的目的是在按键时更新变量。处理有一个名为keyPressed的变量,如果按下某个键,该变量为True。按下的键的标识将作为字符串保存在名为key的变量中 if keyPressed: if key == "a": a += 0.1 elif key == "s": a -= 0.1 elif 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语句,但是可以用dict替换第二个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语句,但是可以用dict替换第二个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
挑战在于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
您可以使用switch-case语句,对于许多项目来说,它比elif-statements@Antoine-Stock要快,一个例子是关于C语言的。哦,这是对的,不过,我最近用了太多的C#Python请求了一个switch-case,但从未实现过。如果变量“a”等。。。是字典中的键或类实例的成员。这些变量是模块的全局变量吗?你可以使用switch-case语句,对于许多项目来说,它比elif-statements@Antoine-Stock快,一个例子是关于C语言的。哦,那是对的,我用了太多的C#recentlyA switch-case已经为Python请求过了,但从未实现过。如果变量“a”等。。。是字典中的键或类实例的成员。这些变量是模块的全局变量吗?有变量
a、q、z
不仅可以更改a
。您是更改了它还是遗漏了什么?ops
无法定义:name错误:未定义名称“a”
。我们应该手动定义所有100个键吗?@ipj-否则您将如何定义它们?总有一天你会不得不这么做的。在这个用例中使用字典是一个很好的解决方案。我尝试了这个方法,但是,虽然没有出现错误,但当按下按钮时,什么也没有做。我想这可能与处理有关。我在python中直接测试了它,将keyPressed替换为1==1,并设置了一个名为key的变量,我将该变量分配给字符串“a”。我没有发现运行if语句会导致a增加0.1。(我是新手,我可能犯了一个错误。)。如果您想查看我的代码,请使用下面的链接我已经测试了代码,变量a、q、z的值保持不变。只有var
被更改,但它是临时变量,在按下下一个键时会被重写。不仅a
要更改变量a,q,z
。您是更改了它还是遗漏了什么?ops
无法定义:name错误:未定义名称“a”
。我们应该手动定义所有100个键吗?@ipj-否则您将如何定义它们?总有一天你会不得不这么做的。在这个用例中使用字典是一个很好的解决方案。我尝试了这个方法,但是,虽然没有出现错误,但当按下按钮时,什么也没有做。我想这可能与处理有关。我在python中直接测试了它,将keyPressed替换为1==1,并设置了一个名为key的变量,我将该变量分配给字符串“a”。我没有发现运行if语句会导致a增加0.1。(我是新手,我可能犯了一个错误。)。如果您想查看我的代码,请使用下面的链接我已经测试了代码,变量a、q、z的值保持不变。只有var
被更改,但它是临时变量,当按下下一个键时会被重写。如果我们想使用前面提到的全局变量,这是一个很好的解决方案。很好的增量/减量观测。工作完美!不过有一个小小的错误:它是“按下键”而不是“按下键”。如果我们想使用前面提到的globals,这是一个很好的解决方案。很好的增量/减量观测。工作完美!不过有一个小错误:它是“按键”而不是“按键”。