Python 按位与布尔运算符
Python bitwise vs boolean operators
我正在阅读基于 Python 的交易平台的 tutorial,它建议使用按位 (~
、&
、|
) 而不是布尔 (not
、and
、or
) 运算符来组合布尔表达式。
Like factors, filters can be combined. Combining filters is done using
the &
(and) and |
(or) operators.
这有充分的理由吗?我以前从未见过它。我不完全确定 Python 中布尔值的所有属性,但我相信在 C 和 C++ 中布尔值由整数 1 或 0 表示,并且可以这样操作。 Python 相似吗?我可以看到 &
和 |
至少在那种情况下是如何工作的。
使用这些按位运算符而不是布尔运算符的目的是什么?是不是更快了?
按位运算符通常是非常错误的工具。按位运算符并不快(它们实际上必须做更多的工作),并且具有不同的优先级,因此与布尔运算符相比,它们绑定到更大表达式的不同部分。
但是,在一些特定的框架中,按位运算符取代了布尔运算符,因为它们可以被挂钩。有 __or__
and __and__
特殊方法可以让您控制 |
和 &
的 return 值,但是布尔运算符没有这样的钩子(因为后者 short-circuit; 评估两个表达式以传递给 hook 会打败它)。
因此,如果文章谈论的是 numpy(或 numpy 派生的框架,例如 Pandas 或 Scipy),或者像 SQLAlchemy、Peewee 或 Django 这样的 ORM 框架,那么有一个很好的使用按位运算符的原因。
我正在阅读基于 Python 的交易平台的 tutorial,它建议使用按位 (~
、&
、|
) 而不是布尔 (not
、and
、or
) 运算符来组合布尔表达式。
Like factors, filters can be combined. Combining filters is done using the
&
(and) and|
(or) operators.
这有充分的理由吗?我以前从未见过它。我不完全确定 Python 中布尔值的所有属性,但我相信在 C 和 C++ 中布尔值由整数 1 或 0 表示,并且可以这样操作。 Python 相似吗?我可以看到 &
和 |
至少在那种情况下是如何工作的。
使用这些按位运算符而不是布尔运算符的目的是什么?是不是更快了?
按位运算符通常是非常错误的工具。按位运算符并不快(它们实际上必须做更多的工作),并且具有不同的优先级,因此与布尔运算符相比,它们绑定到更大表达式的不同部分。
但是,在一些特定的框架中,按位运算符取代了布尔运算符,因为它们可以被挂钩。有 __or__
and __and__
特殊方法可以让您控制 |
和 &
的 return 值,但是布尔运算符没有这样的钩子(因为后者 short-circuit; 评估两个表达式以传递给 hook 会打败它)。
因此,如果文章谈论的是 numpy(或 numpy 派生的框架,例如 Pandas 或 Scipy),或者像 SQLAlchemy、Peewee 或 Django 这样的 ORM 框架,那么有一个很好的使用按位运算符的原因。