Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这些类似的if语句如何写得更简洁?_Python_Logic - Fatal编程技术网

Python 这些类似的if语句如何写得更简洁?

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 == "

这是python处理模式的代码片段。此代码的目的是在按键时更新变量。处理有一个名为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语句,但是可以用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,这是一个很好的解决方案。很好的增量/减量观测。工作完美!不过有一个小错误:它是“按键”而不是“按键”。