2017-09-27 59 views
1

我对比较运算符感到困惑。例如,比较运算符给出|的不同值&与或相比 - Python

10 or 20 == 20 
# output, expected True 
10 

    10 | 20 == 20 
(10 | 20) == 20 
(10 or 20) == 20 

所有3行代码给'假',但我期待'真'。

10 or 20 == 20 
# output gives 10, but was expecting True 
10 

又如:

10 and 20 > 2 
# output is as expected 
True 

(10 and 20) > 2 
True 

(10 & 20) > 2 
# output gives False, but was expecting True 
False 

最后,如果我这样做:

10 or 20 > 100 
#output is 10. No idea why 
10 
3 or 8 < 200 
3 

谁能帮助清理这种混乱?非常感谢花时间阅读我的困惑!我正在使用Python 3.6

+0

只需单独打印每个表达式,然后您就会理解其复合的逻辑。例如'(10或20)'是10,但是“(10 | 20)”是30. – Zefick

+1

'10&20'是按位和',所以'01010&10100'(二进制),确实是'00000'这不高于2 – Rafalon

回答

0

它类似于真或假的情况下:

>>> 20 or 10 
20 
>>>(20 or 10) == 10 
False 
>>>(20 or 10) == 20 
True 

这是因为它需要为真,下一个为假的第一个值,当你传递true或false你得到真正的同样你获得20实际上在这里代表真实。 希望这有助于。

+0

感谢user8477766。我的问题是,如果每次只使用'=='运算符评估/比较第一个数字,那么看起来几乎毫无意义的做链比较运算符。也许只是'(20)== 10'给出'True'不要让声音卡住,但我个人不喜欢它背后的“逻辑”。似乎并不比'真或假==真'给出'真'。预先知道输出时无意识地运行代码。 – MichaelRSF

+0

@MichaelRSF你的例子似乎毫无意义,因为*它毫无意义*。当您链接比较时,输入*不会被重新评估,这就是为什么a jonrsharpe

2

这两个条件运算符都会返回他们必须评估的最后一个条件或值。

or运算符评估这些条件中的任何一个是否为真,并返回它评估的最后一个条件。由于10在Python(或任何其他语言)中被认为是True,所以语言甚至不会经过第二个条件(或值)并返回第一个值。而在and的情况下,两个条件都必须为真,如果两个条件都是真的,则返回第二个值,如果两个条件都不成立,则返回第一个值。

>>> True or False 
True 
>>> False or True 
True 
>>> True and False 
False 

# Similarly 
>>> 10 or 20 
10 
>>> 10 and 20 
20 
>>> 0 or 10 
10 
>>> 0 and 10 
0 

这种行为也提供了一定的b = a if a else c这种行为的一个方便的选择。

+0

谢谢hspandher,但说实话,我发现逻辑反直觉。我认为说'10或20 == 20'并且期望'真实'而不是10是不合理的。如果只评估第一个数字,那么比较链运算符有什么意义,即'(10或者20或者30)> 15',它给出了“假”而不是“10”。 – MichaelRSF

+0

@MichaelRSF这种行为可能会有一定的负面影响,但通常情况下,这种行为非常方便。我不知道我有多少次使用这个东西作为'if-else'结构的一个方便的替代方法。 – hspandher