python中的嵌套条件

时间:2018-12-14 16:25:03

标签: python

我试图找出最短,最pythonic的方式来实现类似于以下语法的方式:

if A and (B if C):
    print(A)

以下列方式:

  • 如果C为False,则省略B(因此(B if C)为True)。
  • 如果C为True,则对B进行求值,从而有效地使语法为 if A and B:

这可以通过各种单独的if语句来完成,但是我的最终目的是使它成为对值分配的列表理解。

编辑:

我想进行的列表理解是:

methods = [name for (name, func) in locals().items() \
    if callable(func) and (not __name__ == '__main__' or \
    func.__module__ == __name__)]

以便它返回我在该模块中定义的函数名称,以及methods是从外部导入的。

5 个答案:

答案 0 :(得分:4)

如果我的旧语句逻辑不会使我失败=>

if A and (not C or B):
    print(A)

说明:"B if C" <=> C -> B <=> not C or B

仅当B成立时,才评估表达式C

答案 1 :(得分:2)

您的假设:

  • 如果C为False,则省略B
  • 如果C为True,则对B求值,从而有效地使A和B的语法:

那不是:

if A and (not C or B):
    print(A)
  • 如果C为假,则not CTrue,我们不评估B
  • 如果C为真,则not CFalse,我们必须评估B

答案 2 :(得分:2)

您的if伪运算符只是逻辑含义,其中

C -> B = not C or B

这意味着您只想要

if A and (not C or B):

C为False时,A and (not C or B) == A and (True or B) == A and True == A

C为True时,A and (not C or B) == A and (False or B) == A and B

答案 3 :(得分:2)

此:

if A and (B if C else True):
    pass

最接近您的“伪代码”,在Python中使用条件表达式x if cond else y。假设B=TrueCFalse的情况下,使if语句仅考虑A的布尔值

答案 4 :(得分:1)

我可能会这样写:

condition = (A and B) if C else A
if condition:
    print(A)

我只将条件分解为一个单独的变量,因为我认为将if与Python条件表达式混合会显得有些混乱。无论是否在列表理解中使用它,您都必须打个电话。