Python Don';我不明白为什么(5 |-2)>;0为假,其中(5或-2)>;0是真的
这是一个非常琐碎的问题,我还没有找到答案 问题就在这里。我有以下数组:Python Don';我不明白为什么(5 |-2)>;0为假,其中(5或-2)>;0是真的,python,conditional,Python,Conditional,这是一个非常琐碎的问题,我还没有找到答案 问题就在这里。我有以下数组: vals = [-5, 2] 我想检查val[0]或val[1]是否大于0。如果其中一个为true,那么我应该输出true 我立即想到的是使用(VAL[1]或VAL[0])>0但我发现(5 |-2)>0为假,而(5或-2)>0为真 如有任何澄清,将不胜感激 或与之间有什么区别? 或是逻辑or,|是位或逻辑包含or 逻辑or 例如: >>> None or False or 5 5 >>>
vals = [-5, 2]
我想检查val[0]
或val[1]
是否大于0。如果其中一个为true,那么我应该输出true
我立即想到的是使用<代码>(VAL[1]或VAL[0])>0但我发现(5 |-2)>0
为假,而(5或-2)>0为真
如有任何澄清,将不胜感激 或
与
之间有什么区别?
或
是逻辑or,|
是位或逻辑包含or
逻辑or
例如:
>>> None or False or 5
5
>>> -5 or 2
-5
按位或逻辑包含或
按位或逻辑包含or由python中的|
运算符表示,并创建一个
例如:
>>> None or False or 5
5
>>> -5 or 2
-5
- 2是二进制的
0010
- 4是二进制的
0100
两者之间的逻辑or将导致0110
,即6
>>> 2 | 4
6
负数的存储方式通常是特定于实现的。然而,在大多数系统中,负数是通过将每个位反转并加1来创建正数的整数来存储的
按位或其他任何数字中的该数字仍然会导致负数:
>>> -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(x > 0 for x in vals)
True
您需要any
功能:
>>> any(x > 0 for x in vals)
x | y
计算两个值的位或
,而x或y
计算为第一个“truthy”值。在这两种情况下,将结果与0
:(x或y)>0
和(x | y)>0
进行比较
要将每个值与零进行比较的内容(如有必要),以及
如果你有三个值,你会写
vals[0] > 0 or vals[1] > 0 or vals[2] > 0
any
函数将其概括为任意大小的列表,而无需根据列表的大小决定要将多少个术语组合在一起。如果执行(5 |-2)
,则执行的是按位或。这将保留数字中的否定位。因此,你仍然会有一个负数
(5或-2)
是一个逻辑or,Python解释器会将其扩展到下一个逻辑运算符(大于)。它们是两个完全不同的操作,因此是预期的
为了说明这一点,这里有一个小的shell日志:
In [1]: 5 or -2
Out[1]: 5
In [2]: 5 | -2
Out[2]: -1
或
运算符返回第一个非零(非无
、非假
等)值
|
运算符执行按位或运算。举例说明:
In [3]: bin(5)
Out[3]: '0b101'
In [4]: bin(-2)
Out[4]: '-0b10'
In [5]: bin(5 | -2)
Out[5]: '-0b1'
|
是OR,Python使用整数表示法。评估5 |-2
给出:
... 0000 0000 0000 0101 (+5)
| ... 1111 1111 1111 1110 (-2)
──────────────────────────────
= ... 1111 1111 1111 1111 (-1)
并且-1不大于零,因此(5 |-2)>0
为false
或
是逻辑or。与此运算符返回布尔值(真/假)的其他语言不同,Python将x或y
定义为等同于x if x else y
(x只计算一次除外)。请注意,在Python中,任何非零数值都是“truthy”,因此如果x≠0,然后x或y
计算为x
>>> 5 or -2
5
>>> -2 or 5
-2
(5或-2)>0
的计算结果为真,这是一次幸运,因为它首先得到了正数。按照另一个顺序,你会得到错误的答案
一般来说,(x或y)>0
并不等同于(x>0)或(y>0)
,这就是你的意思。要回答这个问题,我必须解释两的补码
数字的二进制表示
所以您知道在内部,像5这样的整数是如何表示为二进制字符串的
00000000000000000000000000000101
你怎么想象你会代表一个负数
好吧,下面是我们要做的:
- 加法对负数和正数的作用相同;i、 e.您按照与4+-9相同的步骤添加4+9
- 整数溢出不应破坏数学;i、 e.
MAX\u值+1==MIN\u值
,MIN\u值-1==MAX\u值
所以我们所做的被称为“两个补码”
二元补码
若要表示负数,请取其绝对值,对每一位进行位翻转,然后加1
所以如果正数是5
00000000000000000000000000000101
负数-5是
11111111111111111111111111111011
本质上,这意味着我们选择数字011111111111111
作为最大正数,之后的所有数字都是负数
那么(5 |-2)是什么意思呢?
|
是按位or运算符。给定两个数字,它把每一位和或都加在一起,构造一个新的数字,其中一个数字是1,如果这个位置的数字在威瑟尔,或者两个原始数字都是1,否则是0。计算结果如下所示:
5 -> 00000000000000000000000000000101
| -2 -> 11111111111111111111111111111110
---- --------------------------------
11111111111111111111111111111111 -> -1
如你所见,5 |-2=-1<0
(5或-2)怎么样?
“or”运算符接受两个值,将它们转换为布尔值,然后将它们组合在一起。这一点很重要:它不返回值或值,它返回第一个值,即“truthy”——换句话说,如果将其放入if语句中,它将运行
唯一不是“truthy”的整数是0。因此(5或-2)返回5和2的第一个非零整数,即5>0。所以5或-2=5>0。|
是一个位运算符,而不是任何非零x
@chepner的逻辑或x或y==x
!不要假定运算符优先,也不要假定解释器知道你的意思。相关:我觉得自己很笨,但为什么所有1
s都等于-1
,而不是2^16或其他什么?@user1717828因为通常的惯例是