使用布尔AND时显式评估两个条件

时间:2014-11-28 12:45:44

标签: java python

我对Python并不熟悉。从Java我知道在条件语句中,如果我们想要同时评估&&的操作数,我们使用&代替。例如:

if ( x == 2 & y++ == 3)
    // do this

但是我在python 2.7中工作,我想执行如下操作:

if x == 2 and myList.pop() == 3:
    # do this

and操作数必须执行。

在Python中,将执行第一次比较,如果为false,则跳过第二次比较。但我希望它们都能执行,即使第一次比较返回False。 在Python中有没有解决方案?

3 个答案:

答案 0 :(得分:3)

在使用and进行测试之前,您首先执行条件:

# explicitly execute the conditions first, compare the outcomes later
test1, test2 = x == 2, myList.pop() == 3
if test1 and test2:

对于您的案例,可以简化为myList.pop()来电:

# explicitly pop a value from myList, regardless of what x == 2 returns
myList_value = myList.pop()
if x == 2 and myList_value == 3:

当然,你也可以换掉测试:

if myList.pop() == 3 and x == 2:

确保始终执行list.pop()方法。

否则,&按位运算符为Python布尔值重载,就像在Java中一样:

>>> from itertools import product
>>> for a, b in product([False, True], repeat=2):
...     print('{a!r:5} and {b!r:5}: {o1!r:5}    {a!r:5} & {b!r:5}: {o2!r:5}'.format(a=a, b=b, o1=a and b, o2=a & b))
... 
False and False: False    False & False: False
False and True : False    False & True : False
True  and False: False    True  & False: False
True  and True : True     True  & True : True 

因此你可以使用它来避免短路,但只有当两个操作数都是布尔值

>>> def foo():
...     print 'called!'
...     return False
... 
>>> def bar():
...     print 'also called!'
...     return False
... 
>>> foo() and bar()
called!
False
>>> foo() & bar()
called!
also called!
False

但是,我考虑使用此 unpythonic ,并指示编码风格不佳。重新构建代码,不必首先依赖于此。

答案 1 :(得分:1)

&运算符存在于python中。它将调用__and__魔术方法,该方法用于对操作数执行按位和操作

例如

assert 3 & 6 == 2
assert True & 3 == 1

x = 0
y = [3]
assert not(x == 2 & y.pop() == 3)
assert y == []

但是,您要测试两件事情是否属实,而不是进行按位操作。您最好在重新编写条件的条款或事先执行单独的条件并在之后进行测试。

答案 2 :(得分:0)

您可以使用python的内置all()any()函数来避免短路评估。

为了实现&,您可以轻松使用all()

if (all([cond1, cond2])):
    ...

同样,对于|,您可以使用any()