【问题标题】:How can these similar if statements be written more concisely?如何更简洁地编写这些类似的 if 语句?
【发布时间】:2020-07-27 21:42:51
【问题描述】:

这是处理python模式的代码sn-p。此代码的目的是在按下键时更新变量。 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 个键,每个键都有不同的变量需要调整?

【问题讨论】:

  • 您可以使用 switch-case 语句,对于许多项目来说它比 elif 语句更快 stackoverflow.com/questions/767821/…
  • @Antoine Stock,一个例子是关于 C 语言的。
  • 哦对了没关系,我最近用太多C#了
  • 已请求 Python 的 switch case,但从未实现。 python.org/dev/peps/pep-3103
  • 如果变量“a”等是字典中的键或类实例的成员,这会更容易。这些变量是模块的全局变量吗?

标签: python logic


【解决方案1】:

挑战在于 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

【讨论】:

  • 如果我们想使用所讨论的全局变量,这是一个很好的解决方案。很好的增量/减量观察。
  • 完美运行!但是有一个小错误:它是“keyPressed”而不是“key_pressed”。
【解决方案2】:

没有办法使用第一个 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

【讨论】:

  • 有变量a,q,z不仅可以改变a。你改变它还是我错过了什么?
  • ops 无法定义:NameError: name 'a' is not defined。我们应该手动定义所有 100 个键吗?
  • @ipj - 你还会如何定义它们?你将不得不在某个时候。在这个用例中使用字典是一个很好的解决方案。
  • 我试过了,虽然它没有出错,但按下按钮时什么也没做。我认为这可能与处理有关。我通过用 1 ==1 替换 keyPressed 直接在 python 中对其进行了测试,并设置了一个名为 key 的变量,我将其分配给字符串“a”。我没有发现运行 if 语句会导致 a 增加 0.1。 (我是新手,我可能犯了错误。)。如果您想查看我的代码,请使用以下链接pastebin.com/cxwiD2QU
  • 我测试了变量a,q,z的代码和值保持不变。只更改了var,但它是临时变量,按下下一个键时会被覆盖。
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
相关资源
最近更新 更多