在python中收缩非常大的If语句

2024-09-21 03:20:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一种情况,我有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语句

谢谢


Tags: ifvar情况语句命名edxelifvar1
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]()

您可以使用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

这只是一个更“黑”的版本,@Henry Woody的答案更具可读性,同时更清晰。为了更像Python,我会推荐他的

您可以尝试一次考虑单个变量的更新过程,并创建一个函数来处理该过程。这样,逻辑就可以很容易地为每个变量重用。这意味着您将拥有一个处理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])类似,但处理在字典中找不到键的情况,然后返回默认值(第二个参数)

相关问题 更多 >

    热门问题