我不确定何时应该使用布尔运算符和位运算符。
and
和&
的区别or
和|
的区别
请问有人能告诉我在什么情况下使用每种运算符,以及选择其中一种会如何影响我的结果?
我不确定何时应该使用布尔运算符和位运算符。
and
和 &
的区别or
和 |
的区别请问有人能告诉我在什么情况下使用每种运算符,以及选择其中一种会如何影响我的结果?
以下是一些指导原则:
短路行为在这样的表达式中很有用:
if x is not None and x.foo == 42:
# ...
如果使用按位 &
运算符,则此方法将无法正确运行,因为两侧将始终被计算,从而导致 AttributeError: 'NoneType' object has no attribute 'foo'
。当您使用布尔运算符 and
时,如果第一个表达式为 False,则不会计算第二个表达式。同样地,如果第一个参数为 True,则 or
不会计算第二个参数。
&
、|
、^
也是集合操作符。 - kennytmTrue or "True"
是可以的(它将返回第一个真值),但 True | "True"
将会抛出异常。 - Hannele0 == False
和1 == True
都为真。 - Nuno André以下是另一个差异,曾让我感到困惑:因为&
(和其他位运算符)的优先级高于and
(和其他布尔运算符),所以以下表达式会计算出不同的值:
0 < 1 & 0 < 2
对比
0 < 1 and 0 < 2
换句话说,第一个产生False
,因为它等同于 0 < (1 & 0) < 2
, 因此 0 < 0 < 2
,因此0 < 0 并且 0 < 2
。
and
和or
直接来自布尔逻辑(因此操作两个布尔值以生成一个布尔值),而&
和|
将布尔与/或应用于整数的各个位。这里有很多关于后者如何工作的问题。and
和or
短路,例如True or sys.exit(1)
不会退出,因为对于第一个操作数的某个值(True or ...
,False and ...
),第二个操作数不会改变结果,因此不需要被评估。但是|
和&
不会短路-True | sys.exit(1)
会将您从REPL中抛出。&
和|
是常规运算符,可以重载,而and
和or
则被强制加入语言中(尽管用于布尔强制转换的特殊方法可能具有副作用)。
and
和or
返回操作数的值,而不是True
或False
。这不会改变条件中布尔表达式的含义-1 or True
是1
,但是1
也是true。但曾经用于模拟条件运算符(C语法中的cond? true_val: false_val
,Python中的true_val if cond else false_val
)。对于&
和|
,结果类型取决于操作数如何重载相应的特殊方法(True&False
是False
,99&7
是3
,对于集合来说则是并集/交集...)。
但即使例如 a_boolean & another_boolean
的工作方式相同,正确的解决方案也是使用 and
- 简单地因为 and
和 or
与布尔表达式和条件相关联,而 &
和 |
则代表位操作。
numpy
中进行逐元素布尔运算,则答案略有不同。您可以使用&
和|
进行逐元素布尔运算,但and
和or
会返回值错误。np.array([True, False, True]) | np.array([True, False, False])
# array([ True, False, True], dtype=bool)
np.array([True, False, True]) or np.array([True, False, False])
# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
np.logical_or(np.array([True, False, True]), np.array([True, False, False]))
# array([ True, False, True], dtype=bool)
5 = 0b101
7 = 0b111
-----------------
5 & 7 = 0b101 = 5 (= 7 & 5)
对于逻辑运算符,这是[Python.Docs]: Boolean operations所述的(强调是我的):
>>> 5 and 7
7
>>> 7 and 5
5
同样适用于| vs. 或者,当然。布尔运算是逻辑运算。
按位运算是对二进制位的操作。
按位运算:
>>> k = 1
>>> z = 3
>>> k & z
1
>>> k | z
3
操作:
&
:如果两个位都是1,则为1,否则为0|
:如果任一位为1,则为1,否则为0^
:如果两个位不同,则为1,如果相同则为0~
:翻转每个位按位运算的一些用途:
布尔运算:
>>> k = True
>>> z = False
>>> k & z # and
False
>>> k | z # or
True
>>>
布尔运算符 'and' 与位运算符 '&' 的区别:
伪代码/Python 帮助我理解了它们之间的差异:
def boolAnd(A, B):
# boolean 'and' returns either A or B
if A == False:
return A
else:
return B
def bitwiseAnd(A , B):
# binary representation (e.g. 9 is '1001', 1 is '0001', etc.)
binA = binary(A)
binB = binary(B)
# perform boolean 'and' on each pair of binaries in (A, B)
# then return the result:
# equivalent to: return ''.join([x*y for (x,y) in zip(binA, binB)])
# assuming binA and binB are the same length
result = []
for i in range(len(binA)):
compar = boolAnd(binA[i], binB[i])
result.append(compar)
# we want to return a string of 1s and 0s, not a list
return ''.join(result)
通常用于条件语句。例如:
if a==2 and b>10:
# Do something ...
这意味着如果两个条件(a==2
和b>10
)同时为真,则可以执行条件语句体。
用于数据操作和提取。例如,如果您想提取整数的四个LSB(最低有效位),可以这样做:
p & 0xF