Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Python Don';我不明白为什么(5 |-2)>;0为假,其中(5或-2)>;0是真的_Python_Conditional - Fatal编程技术网

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因为通常的惯例是