Python简化了对多个布尔条件的检查

2024-06-16 14:19:12 发布

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

我有一个函数,检查3个不同的布尔标志,并有一个唯一的结果,每8个组合。在

"""
a | b | c | out
- + - + - + ---
0 | 0 | 0 | 0
0 | 0 | 1 | 1
0 | 1 | 0 | 2
0 | 1 | 1 | 3
1 | 0 | 0 | 4
1 | 0 | 1 | 5
1 | 1 | 0 | 6
1 | 1 | 1 | 7
"""

def do_stuff(a, b, c):
    if a:
        if b:
            if c:
                return function7()  # a, b, c
            return function6()  # a, b, !c
        if c:
            return function5()  # a, !b, c
        return function4()  # a, !b, !c
    else:
        if b:
            if c:
                return function3()  # !a, b, c
            return function2()  # !a, b, !c
        if c:
            return function1()  # !a, !b, c
        return function0()  # !a, !b, !c

自从我返回(退出循环)以来,我已经缩短了很多else语句。在

有没有更干巴巴的方法来完成这一点?我可以转换成二进制,并执行if/elif的单个深度级别,但我不想使用“幻数”。在

另外,我意识到这只是8个结果的16行代码,但是如果是4个变量,有没有办法提高可读性/流?在


Tags: 函数returnif标志defoutdoelse
3条回答

您需要有某种从结果到函数的映射,以及从输入到结果的映射。您在顶部提供的漂亮的表,再加上Python中的bool只是整数0和{}这一事实为您提供了以下信息:

outcomeToFunc {
    0: function0,
    1: function1,
    2: function2,
    3: function3,
    4: function4
    # etc...
}

def inputToOutcome(a, b, c):
    return a << 2 | b << 1 | c

def do_stuff(a, b, c):
    outcome = inputToOutcome(a, b, c)
    return outcomeToFunc[outcome]()

如果您对具有任意数量的布尔输入感兴趣,可以修改do_stuff和{}以使用varargs:

^{pr2}$

首先,你可以建立一个二进制到十进制转换器。之后获取新的数字,您可以通过函数名在字符串中按eval函数调用方法:

def function0():
    print("function0")
def function1():
    return 1;
a = eval("function1()")
print(a)

请记住,您可以将全局变量传递给eval函数,除非使用当前的全局名称id。在

这里有两个解决方案。它们是否比你展示的漂亮,这取决于你自己。在

def do_stuff(a, b, c):
    flags = bool(a), bool(b), bool(c)
    if flags == (True, True, True):
        return function7()
    if flags == (True, True, False):
        return function6()
    if flags == (True, False, True):
        return function5()
    if flags == (True, False, False):
        return function4()
    if flags == (False, True, True):
        return function3()
    if flags == (False, True, False):
        return function2()
    if flags == (False, False, True):
        return function1()
    if flags == (False, False, False):
        return function0()

def do_stuff(a, b, c):
    control = {
        (True, True, True): function7,
        (True, True, False): function6,
        (True, False, True): function5,
        (True, False, False): function4,
        (False, True, True): function3,
        (False, True, False): function2,
        (False, False, True): function1,
        (False, False, False): function0,
    }
    return control[bool(a), bool(b), bool(c)]()

相关问题 更多 >