【问题标题】:Shrinking very large If statements in python在python中缩小非常大的If语句
【发布时间】:2021-02-21 00:27:39
【问题描述】:

我有 4 个变量名为 eax、ebx、ecx 和 edx,它们中的任何一个都可以设置为这些变量中的任何一个:var1、var、var3 和 var4,但是它们被设置为字符串“varx”而不是 varx 的值,但每次只有一个需要修复。我一直在使用这个 if 语句:

  if eax=="var1":
    eax=var1
  elif ebx=="var1":
    ebx=var1
  elif ecx=="var1":
    ecx=var1
  elif edx=="var1":
    edx=var1
  elif eax=="var2":
    eax=var2
  elif ebx=="var2":
    ebx=var2
  elif ecx=="var2":
    ecx=var2
  elif edx=="var2":
    edx=var2
  elif eax=="var3":
    eax=var3
  elif ebx=="var3":
    ebx=var3
  elif ecx=="var3":
    ecx=var3
  elif edx=="var3":
    edx=var3
  elif eax=="var4":
    eax=var4
  elif ebx=="var4":
    ebx=var4
  elif ecx=="var4":
    ecx=var4
  elif edx=="var4":
    edx=var4

但我知道这是非常糟糕的做法。有没有办法让我压缩这个 if 语句?

谢谢。

【问题讨论】:

  • Stack Overflow 并不是学习基本编程技术的正确场所。
  • 通常我会使用开关,但 python 没有它们。我不知道在哪里可以学习这些基本技术。如果您能将我重定向到学习这些的地方,我将不胜感激。
  • @KarlKnechtel 这似乎是一个特定的主题问题。我不确定它是否处于初学者级别。
  • 你的问题不在于缺少“switch语句”;问题是你有一堆变量名,你想在选择适当的变量名后做类似的事情。试着想一个你听说过的数据结构,它可以将所有相关的值存储在一起,将名称与值相关联;并尝试想办法重复检查每个名称的常见过程。
  • @BrianMcCutchon 这类问题的问题在于,大量初学者会有相同的潜在误解或盲点,这会导致在完全不同的上下文中出现大量细微不同的问题。所有这些对下一个初学者都没有帮助,因为它们不容易被搜索到。并且标记为重复通常不起作用,因为a)可能只是没有规范的重复,b)初学者永远不会猜测要搜索的内容。

标签: python if-statement


【解决方案1】:

您可以尝试一次考虑单个变量的更新过程,然后创建一个函数来处理它。然后可以轻松地为每个变量重用逻辑。这意味着您将拥有一个处理 4 个(或 5 个)案例并调用它 4 次(导致 8-9 个步骤)的函数,而不必执行每个组合(16 个步骤)。这还具有使您的代码更具可读性和可维护性的好处。

例如:

def get_var(x):
    if x == "var1":
        return var1
    if x == "var2":
        return var2
    if x == "var3":
        return var3
    if x == "var4":
        return var4
    return x

eax = get_var(eax)
ebx = get_var(ebx)
ecx = get_var(ecx)
edx = get_var(edx)

请注意,这基本上是一个 switch 语句(Python 不支持),而是可以用以下方式编写(根据您的代码的其余部分,这可能更容易更新):

vars_lookup = {
    "var1": var1,
    "var2": var2,
    "var3": var3,
    "var4": var4,
}

def get_var(x):
    return vars_lookup.get(x, x)

eax = get_var(eax)
ebx = get_var(ebx)
ecx = get_var(ecx)
edx = get_var(edx)

请注意,dict 类型的 get 方法与通常的括号表示法 (vars_lookup[x]) 类似,但会处理在字典中找不到键的情况,然后返回默认值(第二个论据)。

【讨论】:

  • 字典(Python 哈希表)执行速度更快,编写起来更简洁(特别是因为在许多情况下,它可以通过编程方式构建为其他一些必要过程的副产品)。
  • @JamesTollefson,请注意,我已经更新了答案以包含使用字典的方法。
【解决方案2】:

您可以使用vars()

variable_list = [v for v in [eax, ebx, ecx, edx] if v is not str else vars()[v]]

eax = vars()[eax] if eax is not str else eax
ebx = vars()[ebx] if ebx is not str else ebx
ecx = vars()[ecx] if ecx is not str else ecx
edx = vars()[edx] if edx is not str else edx

这只是一个更“hacky”的版本,@Henry Woody 的答案更具可读性,同时更简洁。为了更加pythonic,我会推荐他的这个

【讨论】:

    【解决方案3】:

    到目前为止,最简单的解决方案是使用字典。简单定义如下:

    var_dict = {
        'var1':var1,
        'var2':var2,
        'var3':var3,
        'var4':var4,
        }
    

    那么当你发现需要从字符串值转换为变量的情况时,这样做:

    eax = "var1" #as an example
    eax = var_dict[eax] #now eax is the variable var1
    

    这将更改eax,在这种情况下,从"var1" 变为实际变量本身,var1。如果您愿意,您甚至可以通过这种方式将函数存储在字典中。您只需调用它们:

    var_dict[eax]()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 2014-06-09
      • 2012-08-03
      相关资源
      最近更新 更多