带有 2 个变量和 4 个条件的 IF 语句
Posted
技术标签:
【中文标题】带有 2 个变量和 4 个条件的 IF 语句【英文标题】:IF statement with 2 variables and 4 conditions 【发布时间】:2018-04-04 01:43:23 【问题描述】:我有 2 个变量,比如说 x 和 y,我需要检查它们中的哪一个是 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】:如果x
和y
的每个可能组合都需要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", 1
和func2
需要参数False
怎么办?您将如何编写options[(x, y)](...)
行?您可以使用lambda
或partial
,但这不会使代码更简单。以上是关于带有 2 个变量和 4 个条件的 IF 语句的主要内容,如果未能解决你的问题,请参考以下文章