这是一个非常琐碎的问题,我无法找到答案。
这是问题所在。我有以下数组:
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
任何澄清将不胜感激。
答案 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。
示例:
0010
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_VALUE
,MIN_VALUE - 1 == MAX_VALUE
所以我们做的被称为“ Two's Complement”。
要表示一个负数,请取其绝对值,对每个位进行位翻转,然后加1。
所以如果正数是5
00000000000000000000000000000101
负数-5是
11111111111111111111111111111011
从本质上讲,这意味着我们选择数字01111111111111111111111111111111
为最大的正数,之后的所有数字均为负。
|
是按位或运算符。给定两个数字,它将每个位和(或)与它们在一起,从而构造一个新数字,如果该位置上的数字枯萎或两个原始数字都为1,则该数字为1,否则为0。计算结果如下:
5 -> 00000000000000000000000000000101
| -2 -> 11111111111111111111111111111110
---- --------------------------------
11111111111111111111111111111111 -> -1
如您所见,5 | -2 = -1 <0。
“或”运算符采用两个值,将它们强制转换为布尔值,然后将“或”的值放在一起。这很重要:它不是或不是值,它返回第一个“真实的”值-换句话说,如果将其放在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'