if else if else子句序列的逻辑等价

时间:2013-12-10 10:15:19

标签: python logic control-flow equivalence

我严重睡眠不足,我需要帮助重写这个小的Python逻辑

for _ in range(100):
    if a:
        continue
    elif b:
        continue
    elif c and d:
        continue
    else:
        e()

我想要像

这样的东西
if (some_exprt of a,b,c,d):
    e()

我得到的是:

if not a and  not b and (not c or not d):
   e()

但我真的不知道这是否正确,我是对的吗?

3 个答案:

答案 0 :(得分:6)

else分支 匹配的条件开始。它是abc and d中的一个,因此您需要在此使用ornot来表达else 1}}原始代码的分支将被选中:

if not (a or b or (c and d)):
    e()

然后,您可以通过应用one of De Morgan's lawsnot带入括号,将前面的测试更详尽地表达为:

if not a and not b and not (c and d):
    e()

然后可以进一步扩展到:

if not a and not b and (not c or not d):
    e()

这是你自己已经扩展到的。但我发现第一个版本更具可读性。

答案 1 :(得分:1)

continue无法在if语句中运行。所以我假设你在循环中运行它(while或for)。试试这个:

#whatever loop
if not(a or b or (c and d)):
    e()

没有not的第二种方法将是:

if a or b or (c and d):
    continue
else:
    e()

正如M. Martjin Peters在评论中所解释的那样,第二种方法中的其他方法并不是必需的。您可以删除else并在if块之外移动e()。但是,在我看来,if之后的else会使代码更具可读性。

第二种方法也可以写成:

if a or b or (c and d):
    continue
e()

答案 2 :(得分:1)

if not any((a, b, (c and d))):
    e()
相关问题