Java 使用布尔和时显式计算这两个条件
我对Python不太熟悉。从Java中我知道,在条件句中,如果我们想要计算Java 使用布尔和时显式计算这两个条件,java,python,Java,Python,我对Python不太熟悉。从Java中我知道,在条件句中,如果我们想要计算&&的两个操作数,我们可以使用&。例如: if(x==2&y++==3) //这样做 但我使用的是python 2.7,我希望执行如下操作: 如果x==2且myList.pop()==3: #这样做 但是必须同时执行和的操作数 在Python中,将执行第一次比较,如果为false,将跳过第二次比较。但我希望它们都执行,即使第一次比较返回False。 Python中是否有解决方案?在使用和进行测试之前,您只需先执行条件:
&&
的两个操作数,我们可以使用&
。例如:
if(x==2&y++==3)
//这样做
但我使用的是python 2.7,我希望执行如下操作:
如果x==2且myList.pop()==3:
#这样做
但是必须同时执行和的操作数
在Python中,将执行第一次比较,如果为false,将跳过第二次比较。但我希望它们都执行,即使第一次比较返回False。
Python中是否有解决方案?在使用和
进行测试之前,您只需先执行条件:
# 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
因此,您可以使用它来避免短路,但前提是两个操作数都是布尔数:
但是,我会考虑使用这个非Pyththic,并指示坏的编码风格。首先,重新构造代码,使其不必依赖于此。
您可以使用python内置的all()
或any()
函数来避免短路计算
为了实现&
,您可以轻松使用all()
:
同样,对于|
,您可以使用any()
python中存在&
操作符。它将调用\uuu和
魔术方法,这意味着对操作数执行按位and运算
例如
但是,您希望测试两件事是否正确,而不是执行逐位操作。您最好对条件的子句重新排序,或者先执行单独的条件,然后再进行测试。在您的情况下,只需在if
块中翻转条件,因为x==2
在这种情况下没有任何变化,只需翻转条件即可。如果x!=2FYI:在Java中,如果第一个操作数为false,则第二个操作数也不会执行-使用逻辑&&
。看着二进制&
已经把你引入歧途了。@maksimov。在Java中,&
和&
都是逻辑运算符(应用于布尔操作数时)。两者的区别在于&
使用短路评估,而&
不使用短路评估。例如,当应用于int
s时,&
当然是一个按位操作,但这里不是这样。顺便说一下@eMAD,我认为Java中的&operator并不像您所描述的那样。如果没有一些奇异的重载,它实际上是在两个表达式之间进行位AND运算。请看:@rchang实际上让我想到了这一点,谢谢@MartijnPieters,但明确地评估这一点意味着Python没有解决方案!尽管Python以用几行代码完成大型任务而闻名。但在这种情况下不是@埃马德:但它确实有一个解决方案;只要重新安排你的测试。如果您的代码因短路而失败,您需要重新思考代码,而不是责怪工具。@rchang。java不是C或C++,其中布尔代数基本上是伪装的int。在Java中,运算符在应用于不同类型时可以具有不同的语义&
应用于布尔操作数的不是按位“and”,而是逻辑“and”,没有短路计算。应用于int
类型的操作数(例如)的运算符&
是位运算。这实际上不起作用<代码>所有([cond1,cond2])
都可以工作(例如,传入列表)。但是,与只单独存储cond1
和cond2
相比,它更详细,更不清楚您在做什么。
>>> def foo():
... print 'called!'
... return False
...
>>> def bar():
... print 'also called!'
... return False
...
>>> foo() and bar()
called!
False
>>> foo() & bar()
called!
also called!
False
if (all([cond1, cond2])):
...
assert 3 & 6 == 2
assert True & 3 == 1
x = 0
y = [3]
assert not(x == 2 & y.pop() == 3)
assert y == []