具有不同行为评估的有效Python多if条件

  • 本文关键字:Python 有效 if 条件 评估 python
  • 更新时间 :
  • 英文 :


当您要检查多个连锁if条件时,有没有一种方法可以有效地(可视化/组织化而非性能)编码可能的操作?

以下是人们现在的做法。示例:

variable = 0 # can be 0 or 1
variable1 = 'a' # can be 'a', 'b'
if variable == 0 and variable1 == 'a':
print('1')
elif variable == 0 and variable1 == 'b':
print('2')
elif variable == 1 and variable1 == 'c':
print('3')
elif variable == 1 and variable1 == 'd':
print('4')

或者你可以做NESTED if循环。

但当你有时,这显然变得非常站不住脚:

variable = True # can be True or False
variable1 = 'a' # can be 'a', 'b', 'c'
variable2 = '1a' # can be '1a', '1b', '1c'
variableNth = 'aaa' # can be 'aaa', 'bbb', 'ccc'... where Nth is large
if variable == 1 and variable1 = 'a' and variable2 = '1a' and variableth = 'aaa':
print('yay!')
elif variable .... (you get the picture)

那么,有没有一种有效的方法来遍历所有可能的结果,并在给定所有组合可能性的情况下写出所需的行为?

我目前的想法是:

variable = 0 # can be 0 or 1
variable1 = 'a' # can be 'a', 'b'
# slightly more visually appealing? 
results_dict = {}
results_dict[str('0') +str('a')] = result1_func
results_dict[str('0') +str('b')] = result2_func
results_dict[str('1') +str('a')] = result3_func
results_dict[str('1') +str('b')] = result4_func
# and for more possibilities:
results_dict[str('0') + str('a') + str('aaa')] = result5_func
def result1_func(*arg, **karg):
print('yay!')
def result2_func(*arg, **karg):
print('no')
def result3_func(*arg, **karg):
print('3')
def result3_func(*arg, **karg):
print('4')
def func_else(*arg, **karg):
print('5')

并且你使用它:

>>>> func = results_dict[str(variable) + str(variable1)]
>>>> func(variable, variable1)

但现在处理普通的"其他"案件如果不被抓住的话会更烦人

>>>> func = results_dict.get(str(variable) + str(variable1), func_else) 

这是要走的路吗?是否已有解决方案?(我可以继承框架来做我想做的事情?)

编辑以澄清func_else:func_else可以用于不写下所有可能性的情况:

variable = 0# can be 0 or 1
variable1 = 'a' # can be 'a', 'b', 'c'

但我只关心组合(0和a)或('1'和'c')。那么我不需要填写所有6种可能性,只需填写2种,然后在我的函数else 中获取其余的可能性

只需使用元组作为键并直接构建字典

func_dict = {(0, '1') : func1, ....}
.....
result = func_dict[(variable, variable1)](<params>)

您可以通过继承dict:来处理默认值

class Controller(dict):
def __init__(self, default=None):
self._default = default
def __getitem__(self, key):
if key in self:
return super(Controller, self).__getitem__(key)
return self._default

它的使用方式与您使用过的字典几乎相同,只是您必须使用默认函数对其进行初始化:

results_dict = Controller(default=fn)
func = results_dict[str(variable) + str(variable1)] # will always work
func(variable, variable1)

除此之外,你的方法很好,我肯定会这么做。

最新更新