Jie*_*eng 62 python bitwise-operators boolean-operations
我很困惑何时应该使用布尔与按位运算符
__PRE__
可能有人开导我,当我用每时都会使用一个比其他影响我的结果吗?
Mar*_*ers 63
以下是一些指导原则:
短路行为在这样的表达式中很有用:
if x is not None and x.foo == 42:
# ...
Run Code Online (Sandbox Code Playgroud)
对于按位运算&
符,这将无法正常工作,因为将始终对双方进行求值AttributeError: 'NoneType' object has no attribute 'foo'
.当您使用布尔and
运算符时,当第一个表达式为False时,不会计算第二个表达式.or
如果第一个参数为True,同样不会评估第二个参数.
小智 20
从理论上讲,and
和or
直来自布尔逻辑(并且因此在两个布尔操作以产生一个布尔),而&
和|
布尔应用和/或整数的各个位.关于后者如何正确运作,这里有很多问题.
以下是可能影响结果的实际差异:
and
和or
短路,即,True or sys.exit(1)
将不会退出,因为对于一定的值(True or ...
,False and ...
第一操作数的),第二个不会改变结果=并不需要进行评估.不过|
和&
不短路- True | sys.exit(1)
抛出你离开的REPL.&
并且|
是常规运算符并且可以重载 - and
并且or
伪造成语言(尽管至少在Python中,强制到布尔值的特殊方法可能有副作用).and
并or
返回(总是?从来没有真正理解这一点,我也不需要它)操作数的值而不是True
或False
.这不会改变条件中布尔表达式的含义 - 1 or True
是1
,但1
也是如此.但它曾经被用来模拟一个条件运算符(cond ? true_val : false_val
在C语法中,true_val if cond else false_val
几年后在Python中).对于&
和|
,结果类型取决于操作数如何重载相应的特殊方法(True & False
是False
,99 & 7
是3
,对于它的联合/交集......).但是,即使eg a_boolean & another_boolean
会以相同的方式工作,正确的解决方案正在使用and
- 只是因为and
并且or
与布尔表达式和条件相关联,&
而且|
代表比特笨拙.
Are*_*end 17
这是一个进一步的区别,刚才让我困惑了一段时间:因为&
(和其他位运算符)的优先级高于and
(和其他布尔运算符),以下表达式求值为不同的值:
0 < 1 & 0 < 2
Run Code Online (Sandbox Code Playgroud)
与
0 < 1 and 0 < 2
Run Code Online (Sandbox Code Playgroud)
机智,第一产率False
,因为它相当于0 < (1 & 0) < 2
,因此0 < 0 < 2
,因此0 < 0 and 0 < 2
.
如果您尝试在 中进行逐元素布尔运算numpy
,答案会有所不同。您可以将&
and|
用于逐元素布尔运算,但and
andor
将返回值错误。
为了安全起见,您可以使用numpy 逻辑函数。
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)
Run Code Online (Sandbox Code Playgroud)