布尔运算符与位运算符

2024-06-16 13:46:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道什么时候应该使用布尔运算符还是按位运算符

  • andvs&
  • orvs|

有没有人能告诉我什么时候使用它们,什么时候使用它们会影响我的结果


Tags: 运算符人能andvsorvs
3条回答

以下是一些指导原则:

  • 布尔运算符通常用于布尔值,但位运算符通常用于整数
  • 布尔运算符是短路,但按位运算符是而不是短路

短路行为在以下表达式中很有用:

if x is not None and x.foo == 42:
    # ...

对于按位&运算符,这将无法正常工作,因为始终会对两侧求值,并给出AttributeError: 'NoneType' object has no attribute 'foo'。使用布尔and运算符时,如果第一个表达式为False,则不会计算第二个表达式。类似地,如果第一个参数为真,则or不计算第二个参数

理论上,andor直接来自布尔逻辑(因此对两个布尔运算产生一个布尔值),而&|将布尔值和/或应用于整数的各个位。关于后者到底是如何工作的,这里有很多问题

以下是可能影响结果的实际差异:

  1. andor短路,例如True or sys.exit(1)不会退出,因为对于第一个操作数(True or ...False and ...)的某个值,第二个操作数不会改变结果,因此不需要求值。但是|&不要短路-True | sys.exit(1)会将您从REPL中抛出
  2. &|是正则运算符,可以重载,而andor被伪造成语言(尽管强制为布尔值的特殊方法可能有副作用)。
    • 这也适用于一些具有运算符重载的其他语言
  3. andor返回操作数的值,而不是TrueFalse。这不会改变条件中布尔表达式的含义-1 or True1,但是1也是真的。但它曾经被用来模拟条件运算符(C语法中为cond ? true_val : false_val,Python中为true_val if cond else false_val)。对于&|,结果类型取决于操作数如何重载各自的特殊方法(True & FalseFalse99 & 73,对于集合,它的并集/交集…)。
    • 这也适用于其他一些语言,如Ruby、Perl和Javascript

但是,即使当a_boolean & another_boolean的工作原理相同时,正确的解决方案还是使用and——这仅仅是因为andor与布尔表达式和条件相关,而&|代表位旋转

这里还有一个让我困惑了一段时间的差异:因为&(和其他按位运算符)的优先级高于and(和其他布尔运算符),下面的表达式计算为不同的值:

0 < 1 & 0 < 2

0 < 1 and 0 < 2

也就是说,第一个产生False,因为它相当于0 < (1 & 0) < 2,因此0 < 0 < 2,因此0 < 0 and 0 < 2

相关问题 更多 >