2024-06-16 13:46:03 发布
网友
我不知道什么时候应该使用布尔运算符还是按位运算符
and
&
or
|
有没有人能告诉我什么时候使用它们,什么时候使用它们会影响我的结果
以下是一些指导原则:
短路行为在以下表达式中很有用:
if x is not None and x.foo == 42: # ...
对于按位&运算符,这将无法正常工作,因为始终会对两侧求值,并给出AttributeError: 'NoneType' object has no attribute 'foo'。使用布尔and运算符时,如果第一个表达式为False,则不会计算第二个表达式。类似地,如果第一个参数为真,则or不计算第二个参数
AttributeError: 'NoneType' object has no attribute 'foo'
理论上,and和or直接来自布尔逻辑(因此对两个布尔运算产生一个布尔值),而&和|将布尔值和/或应用于整数的各个位。关于后者到底是如何工作的,这里有很多问题
以下是可能影响结果的实际差异:
True or sys.exit(1)
True or ...
False and ...
True | sys.exit(1)
True
False
1 or True
1
cond ? true_val : false_val
true_val if cond else false_val
True & False
99 & 7
3
但是,即使当a_boolean & another_boolean的工作原理相同时,正确的解决方案还是使用and——这仅仅是因为and和or与布尔表达式和条件相关,而&和|代表位旋转
a_boolean & another_boolean
这里还有一个让我困惑了一段时间的差异:因为&(和其他按位运算符)的优先级高于and(和其他布尔运算符),下面的表达式计算为不同的值:
0 < 1 & 0 < 2
对
0 < 1 and 0 < 2
也就是说,第一个产生False,因为它相当于0 < (1 & 0) < 2,因此0 < 0 < 2,因此0 < 0 and 0 < 2
0 < (1 & 0) < 2
0 < 0 < 2
0 < 0 and 0 < 2
以下是一些指导原则:
短路行为在以下表达式中很有用:
对于按位
&
运算符,这将无法正常工作,因为始终会对两侧求值,并给出AttributeError: 'NoneType' object has no attribute 'foo'
。使用布尔and
运算符时,如果第一个表达式为False,则不会计算第二个表达式。类似地,如果第一个参数为真,则or
不计算第二个参数理论上,
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
也是真的。但它曾经被用来模拟条件运算符(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
与布尔表达式和条件相关,而&
和|
代表位旋转这里还有一个让我困惑了一段时间的差异:因为
&
(和其他按位运算符)的优先级高于and
(和其他布尔运算符),下面的表达式计算为不同的值:对
也就是说,第一个产生
False
,因为它相当于0 < (1 & 0) < 2
,因此0 < 0 < 2
,因此0 < 0 and 0 < 2
相关问题 更多 >
编程相关推荐