不明白为什么(5 | -2)> 0为False(5或-2)> 0为True

时间:2019-03-18 15:21:44

标签: python conditional

这是一个非常琐碎的问题,我无法找到答案。

这是问题所在。我有以下数组:

vals = [-5, 2]

我想检查val[0]val[1]是否大于0。如果其中一个为true,则应该输出True。

我立即想到要使用; (vals[1] or vals[0]) > 0),但我发现(5 | -2) > 0是False,而(5 or -2) > 0是True

任何澄清将不胜感激。

6 个答案:

答案 0 :(得分:43)

or|有什么区别?

or是逻辑或,而|是按位逻辑或逻辑或。

逻辑或

The logical or in python returns the first value that is true.

示例:

>>> None or False or 5
5
>>> -5 or 2
-5

按位或逻辑包含或

按位或逻辑包含或由python中的|运算符表示,并创建一个number where all bits are set that are set in at least one of the given numbers

示例:

  • 2是二进制0010
  • 4是二进制0100

逻辑结果或两个结果之间的0110为6。

>>> 2 | 4
6

如何存储负数通常是特定于实现的。但是,在大多数系统上,通过将每个位取反并加1,来创建正数的two's complement来存储负数。

按位或两个其他数字中的那个数字仍然会导致负数:

>>> -5 | 2
-5

两者都不能解决您的问题

使用

(vals[1] or vals[0]) > 0

似乎可以正常工作,但当您翻转值时失败:

>>> vals = [2, -5]
>>> (vals[1] or vals[0]) > 0
False

您应该分别检查两个值

>>> vals = [-5, 2]
>>> vals[0] > 0 or vals[1] > 0
True

对于较大的输入,这可能不方便。您应该将any与生成器表达式一起使用:

>>> any(x > 0 for x in vals)
True

答案 1 :(得分:14)

您需要any函数:

>>> any(x > 0 for x in vals)

x | y计算两个值的按位OR,而x or y计算为第一个“真实”值。在这两种情况下,然后将结果0(x or y) > 0(x | y) > 0进行比较。

您想要将每个值与零进行比较的内容(必要时),

vals[0] > 0 or vals[1] > 0

如果你有三个值,你会写

vals[0] > 0 or vals[1] > 0 or vals[2] > 0

any函数可将其概括为任意大小的列表,而无需根据列表的大小决定将or一起包含多少个术语。

答案 2 :(得分:5)

要回答这个问题,我必须解释一下Two's Complement。

数字的二进制表示形式

所以您知道内部如何将5等整数表示为二进制字符串

00000000000000000000000000000101

您如何想象自己代表一个负数?

好吧,这是我们想要做的:

  • 加法对于负数和正数应相同;也就是说,您执行相同的步骤将4 + 9添加为4 + -9。

  • 整数溢出不应破坏数学;即MAX_VALUE + 1 == MIN_VALUEMIN_VALUE - 1 == MAX_VALUE

所以我们做的被称为“ Two's Complement”。

两个补全

要表示一个负数,请取其绝对值,对每个位进行位翻转,然后加1。

所以如果正数是5

00000000000000000000000000000101

负数-5是

11111111111111111111111111111011

从本质上讲,这意味着我们选择数字01111111111111111111111111111111为最大的正数,之后的所有数字均为负。

(5 | -2)意味着什么?

|是按位或运算符。给定两个数字,它将每个位和(或)与它们在一起,从而构造一个新数字,如果该位置上的数字枯萎或两个原始数字都为1,则该数字为1,否则为0。计算结果如下:

   5 -> 00000000000000000000000000000101
| -2 -> 11111111111111111111111111111110
----    --------------------------------
        11111111111111111111111111111111 -> -1

如您所见,5 | -2 = -1 <0。

关于(5或-2)的什么?

“或”运算符采用两个值,将它们强制转换为布尔值,然后将“或”的值放在一起。这很重要:它不是或不是值,它返回第一个“真实的”值-换句话说,如果将其放在if语句中,它将运行。

唯一不“真实”的整数是0。因此(5或-2)返回第一个非零整数5和2,即5>0。因此5或-2 = 5> 0

答案 3 :(得分:3)

|bitwise的OR,Python使用two's complement表示整数。评估5 | -2得出:

  ... 0000 0000 0000 0101 (+5)
| ... 1111 1111 1111 1110 (-2)
──────────────────────────────
= ... 1111 1111 1111 1111 (-1)

并且-1不大于零,因此(5 | -2) > 0为假。

or是逻辑或。与其他语言中的该运算符返回布尔值(真/假)不同,Python将x or y定义为等效于x if x else y(除了x仅被评估一次)。请注意,任何非零数值在Python中都是“真实的”,因此,如果x≠0,则x or y的值为x

>>> 5 or -2
5
>>> -2 or 5
-2

(5 or -2) > 0的评估结果为True,这是因为先获得正数才是个幸运。否则,您将得到False。

一般来说,(x or y) > 0(x > 0) or (y > 0)等效,即您的意思。

答案 4 :(得分:2)

当您执行(5 | -2)时,您正在执行按位或运算。这将保留数字中的否定位。因此,您仍然会有一个负数。

(5 or -2)是逻辑或,Python解释器会将其扩展到下一个逻辑运算符(大于)。

答案 5 :(得分:1)

这是两个完全不同的操作,这是可以预期的。

为了说明,这是一个小的shell日志:

In [1]: 5 or -2
Out[1]: 5

In [2]: 5 | -2
Out[2]: -1

or运算符返回第一个非零值(非None,非False等)。

|运算符按位或。为了说明:

In [3]: bin(5)
Out[3]: '0b101'

In [4]: bin(-2)
Out[4]: '-0b10'

In [5]: bin(5 | -2)
Out[5]: '-0b1'