Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用布尔和时显式计算这两个条件_Java_Python - Fatal编程技术网

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中是否有解决方案?在使用和进行测试之前,您只需先执行条件:

我对Python不太熟悉。从Java中我知道,在条件句中,如果我们想要计算
&&
的两个操作数,我们可以使用
&
。例如:

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 == []