找出哪个条件破坏逻辑和表达式

时间:2018-11-22 11:55:38

标签: python boolean-expression

我想找到一种优雅的方法来获取下面的逻辑and表达式的组件,如果if块未执行 ,则该表达式负责。

if test1(value) and test2(value) and test3(value):
   print 'Yeeaah'
else:
   print 'Oh, no!', 'Who is the first function that return false?'

如果输入了else块,如何通过返回第一个伪造的值来找出test1test2test3是负责任的?

Salvo。

3 个答案:

答案 0 :(得分:4)

我们可以将该测试值存储在列表中,然后检查它们是否全部为True,以及是否不打印第一个值为False的索引。

classpath 'com.android.tools.build:gradle:3.1.4'

输出:

def test1(x):
    return True
def test2(x):
    return False
def test3(x):
    return True

value = 'a'
statements = [test1(value), test2(value), test3(value)]

if all(statements):
   print('Yeeaah')
else:
   print('Oh, no! Function that first return False is {}'.format(statements.index(False)))

答案 1 :(得分:1)

将其分为三部分:

使用python3语法:

b1 = test1(value)
b2 = test2(value)
b3 = test3(value)

if b1 and b2 and b3:
    print("Yeah")
else:
    print("Nope! 1: {}, 2: {}, 3: {}".format(b1, b2, b3))

答案 2 :(得分:1)

您可以使用next和一个生成器表达式:

breaker = next((test.__name__ for test in (test1, test2, test3) if not test(value)), None)

演示:

>>> def test1(value): return True
>>> def test2(value): return False
>>> def test3(value): return True
>>> value = '_' # irrelevant for this demo
>>>
>>> tests = (test1, test2, test3)
>>> breaker = next((test.__name__ for test in tests if not test(value)), None)
>>> breaker
'test2'
>>> if not breaker:
...:    print('Yeeaah')
...:else:
...:    print('Oh no!')
...:    
Oh no!

请注意,此代码中从未调用test3

(超级极端情况:如果出于某种原因我无法理解恶作剧者,请在if breaker is not None上使用if not breaker,将功能的__name__属性重新分配给''。)

〜编辑〜

如果您想知道第一个,第二个或第n个测试是否返回了 fassy ,可以将类似的生成器表达式与enumerate一起使用。

>>> breaker = next((i for i, test in enumerate(tests, 1) if not test(value)), None)
>>> breaker
2

如果您想从零开始计数,请使用enumerate(tests)并检查if breaker is not None以输入if块(因为0 fassy None