带有 2 个变量和 4 个条件的 IF 语句

Posted

技术标签:

【中文标题】带有 2 个变量和 4 个条件的 IF 语句【英文标题】:IF statement with 2 variables and 4 conditions 【发布时间】:2018-04-04 01:43:23 【问题描述】:

我有 2 个变量,比如说 xy,我需要检查它们中的哪一个是 None

if x is None and y is None:
    # code here
else:
    if x is not None and y is not None:
        # code here
    else:
        if x is None:
            # code here
        if y is None:
            # code here

有没有更好的方法来做到这一点? 我正在寻找更短的IF ELSE 结构。

【问题讨论】:

另外,请注意python中不存在null。更多信息请参考***.com/questions/3289601/null-object-in-python 【参考方案1】:

如果您有两个布尔值,则有四种不同的可能性:00 01 10 和 11。如果在每种情况下都应该发生明显不同的事情,则有 并不是真的可以减少测试次数。

话虽如此,在某些可比较的情况下,模式匹配可能会感觉更直接。不过,我不知道在 Python 中。

【讨论】:

【参考方案2】:

以下逻辑应适用于所有组合。用您的语言书写

 if (x is not null and y is not null)
        //code here
    
 else if(x is null and y is not null)
        //code here
    
 else if(x is not null and y is null)
        //code here
    
 else
    
    //Code here
    

相同的 C 代码:

int main()

    int x,y;
    printf("Enetr Two Number");
    scanf("%d%d",&x,&y);

        if(x!=NULL && y!=NULL)

            printf("X and Y are not null");
            else if(x==NULL && y!=NULL)
            printf("X is null and Y is not null");
            else if(x!=NULL && y==NULL)
            printf("X is not null and Y is null");

    else
    
        printf("The value of x and y are null");
    

【讨论】:

@Adirio 非常感谢您的更正。你是对的。我已经更新了我的答案。 投反对票:他要求 Python,而不是伪代码或 C。 @Adirio 我想帮助理解不提供确切代码的逻辑。【参考方案3】:

保持您使用的顺序:

if x is None and y is None:
    # code here for x = None = y
elif x is not None and y is not None:
    # code here for x != None != y
elif x is None:
    # code here for x = None != y
else:
    # code here for x != None = y

修改顺序以减少布尔计算:

if x is None and y is None:
    # code here for x = None = y
elif x is None:
    # code here for x = None != y
elif y is None:
    # code here for x != None = y
else:
    # code here for x != None != y

在 4 种情况下,您应该考虑哪个选项的概率更高,哪个选项的概率更高,并将它们保留在前两个选项中,因为这将减少执行期间检查的条件数量。最后两个选项都将执行 3 个条件,因此这两个选项的顺序无关紧要。例如上面的第一个代码认为prob(x=None & y=None) > prob(x!=None & y!=None) > prob(x=None & y!=None) ~ prob(x!=None & y=None),而第二个代码认为prob(x=None & y=None) > prob(x=None & y!=None) > prob(x!=None & y=None) ~ prob(x!=None & y!=None)

【讨论】:

【参考方案4】:

假设您需要分别涵盖所有 4 个案例:

if not x and not y:
    # code here (both are none or 0)
elif not x
    # code here (x is none or 0)
elif not y
    # code here (y is none or 0)
else
    #code here (both x and y have values)

这将是处理它的最短方法,但不仅检查 None/Null 值。 not x 对任何虚假内容返回 true,例如空字符串、False 或 0。

【讨论】:

请注意not (False) 为真。 这是真的,请参阅***.com/questions/20420934/… 了解有关如何在 Python 中处理 if x: 内容的详细信息。 不,我的意思是原始代码只要求检查None,而您的代码会让任何错误的通过。【参考方案5】:

您可以从使用elif 语句开始,它会像这样短一点:

if x is None and y is None:
    # code here
elif x is not None and y is not None:
    # code here
elif x is None:
    # code here
if y is None:
    # code here`

【讨论】:

【参考方案6】:

如果xy 的每个可能组合都需要4 条不同的路径,那么您就不能真正简化那么多。也就是说,我将对其中一个变量的检查进行分组(即先检查 x is None,然后在内部检查 y is None。)

类似这样的:

if x is None:
    if y is None:
        # x is None, y is None
    else:
        # x is None, y is not None
else:
    if y is None:
        # x is not None, y is None
    else:
        # x is not None, y is not None

【讨论】:

【参考方案7】:
  def func1(a):
    print a
  def func2(a):
    print a
  def func3(a):
    print a
  def func4(a):
    print a

  options = (1, 1): func1,
                (1, 0): func2,
                (0, 1): func3,
                (0, 0): func4,

  options[(True, True)](100)

输出:

100

【讨论】:

这要求内部所有函数的签名都相同 @Adirio 不,不是。可以改成*args 问题不在于定义函数时,问题在于调用它的时候。您在知道将调用哪个函数之前传递了100,因此它们都需要处理 1 个参数(即使他们没有对它做任何事情。基本上你需要获取每个函数的参数集并取所有这些都获取调用签名。输出相同。 @Adirio 这只是一个例子。您可以通过更改函数定义将任何参数传递给您想要的功能。 Python 不会在这方面限制你 @galaxyan 但是如果func1 需要参数"foo", 1func2 需要参数False 怎么办?您将如何编写options[(x, y)](...) 行?您可以使用lambdapartial,但这不会使代码更简单。

以上是关于带有 2 个变量和 4 个条件的 IF 语句的主要内容,如果未能解决你的问题,请参考以下文章

Linux-条件判断式

if(boolVar)判断条件不是等式只是一个变量时代表啥意思?

关于if判断和switch

java中if判断中,3个条件满足怎么写

python 语法(空行变量if条件控制循环语句)编码示例

python 语法(空行变量if条件控制循环语句)编码示例