Python 中使用的 & 和竖线字符在哪里?
Posted
技术标签:
【中文标题】Python 中使用的 & 和竖线字符在哪里?【英文标题】:Where are the ampersand and vertical bar characters used in Python? 【发布时间】:2011-09-23 06:05:41 【问题描述】:在Wikipedia page describing short-circuit evaluation 中,&
和 |
在 Python 中被列为急切运算符。这是什么意思,什么时候在语言中使用它们?
【问题讨论】:
【参考方案1】:***页面错误,我已更正。 |
和 &
不是布尔运算符,即使它们是急切的运算符,这只是意味着它们不是短路运算符。您可能知道,python and
和 or
运算符的工作原理如下:
>>> def talk(x):
... print "Evaluating: ", bool(x)
... return x
...
>>> talk(1 == 1) or talk(2 == 1) # 2 == 1 is not evaluated
Evaluating: True
True
>>> talk(1 == 1) and talk(2 == 1)
Evaluating: True
Evaluating: False
False
>>> talk(1 == 2) and talk(1 == 3) # 1 == 3 is not evaluated
Evaluating: False
False
据我所知,python 没有急切的布尔运算符,它们必须被显式编码,例如:
>>> def eager_or(a, b):
... return a or b
...
>>> eager_or(talk(1 == 1), talk(2 == 1))
Evaluating: True
Evaluating: False
True
现在a
和b
会在调用函数时自动评估,即使or
仍然短路。
至于|
和&
的用法,当与数字一起使用时,它们是二元运算符:
>>> bin(0b11110000 & 0b10101010)
'0b10100000'
>>> bin(0b11110000 | 0b10101010)
'0b11111010'
您最有可能以这种方式使用|
,将 python 绑定到使用标志的库,例如 wxWidgets:
>>> frame = wx.Frame(title="My Frame", style=wx.MAXIMIZE | wx.STAY_ON_TOP)
>>> bin(wx.MAXIMIZE)
'0b10000000000000'
>>> bin(wx.STAY_ON_TOP)
'0b1000000000000000'
>>> bin(wx.MAXIMIZE | wx.STAY_ON_TOP)
'0b1010000000000000'
与集合一起使用时,它们分别执行交集和并集操作:
>>> set("abcd") & set("cdef")
set(['c', 'd'])
>>> set("abcd") | set("cdef")
set(['a', 'c', 'b', 'e', 'd', 'f'])
【讨论】:
它们还用于pandas
中用于数据帧上的复杂查询字符串,例如df[ (df['Age'] > 40) & (df['Weight'] < 100)]
。
@cod3monk3y 我也刚在 NumPy 中看到了这种用法,一开始很困惑,但我想没有其他简单的方法可以组合布尔数组进行索引。
你是绝对正确的,但选择了一个不好的例子;) Python 将 bool
类值视为按位运算中的整数(0 == False
和 1 == True
都是正确的)所以你的例子可以使用&
和 |
表现得像急切的逻辑运算符。
&
和 |
确实可以与 True
和 False
一起使用,而不仅仅是因为它们是 0 和 1 而隐含地工作:例如,True | False
是 True
,不是 1.
因为python 3.9 |
现在最终也用于字典的联合:'a': 1, 'b': 2 | 'c': 3, 'b': 4
变为 'a': 1, 'b': 4, 'c': 3
。遗憾的是,目前还没有将其他集合运算符添加到 dict 中。【参考方案2】:
这里的其他答案中缺少的东西是&
和|
在Python 中没有任何普遍意义;它们的含义取决于操作数的类型,使用神奇的__and__
和__or__
方法。由于这些是方法,因此操作数在作为参数传递之前都会被评估(即没有短路)。
在bool
值上,它们是逻辑“与”和逻辑“或”:
>>> True & False
False
>>> True | False
True
>>> bool.__and__(True, False)
False
>>> bool.__or__(True, False)
True
在int
值上,它们是按位“与”和按位“或”:
>>> bin(0b1100 & 0b1010)
'0b1000'
>>> bin(0b1100 | 0b1010)
'0b1110'
>>> bin(int.__and__(0b1100, 0b1010))
'0b1000'
>>> bin(int.__or__(0b1100, 0b1010))
'0b1110'
在集合上,它们是交集和并集:
>>> 1, 2 & 1, 3
1
>>> 1, 2 | 1, 3
1, 2, 3
>>> set.__and__(1, 2, 1, 3)
1
>>> set.__or__(1, 2, 1, 3)
1, 2, 3
补充几点:
__and__
和 __or__
方法总是在类而不是实例上查找。因此,如果您分配 obj.__and__ = lambda x, y: ...
,那么仍会调用 obj.__class__.__and__
。
如果已定义类上的 __rand__
和 __ror__
方法,则它们将具有优先权。
有关详细信息,请参阅Python language reference。
【讨论】:
【参考方案3】:这意味着总是计算左操作数和右操作数。 &
是按位与运算符,|
是按位或运算符。
【讨论】:
那么急切是否意味着他们不像逻辑运算符那样使用短路评估? @Keoki Zee:是的。渴望与lazy相反。 @Keoki - 是的,它们不会短路。如果您将它们视为像+
或 -
这样的算术运算符,而不是布尔运算符,那么您会意识到谈论“短路”并没有真正的意义。【参考方案4】:
& ----> 用于按位与,即逐位与
同样,
| ---> 用于按位或
当你发现任何python问题时,尝试使用python.org,它很有帮助
【讨论】:
@down voter : 请写下你投反对票的评论,这是错的 不是一个有用的评论。您是否尝试过使用关键字“&”和“|”查找文档?此外,您没有回答以下问题:“这是什么意思?什么时候在语言中使用它们?” @warvariuc,阅读文档有什么难的?转到 docs.python.org,单击“General Index”,这将为您提供“Symbols”、“_”、“A”、“B”等选项。单击 Symbols,您会在附近找到“&”顶部(但不可否认不是'|')。单击“&”条目,它会告诉您两者的所有信息。否则,交互式提示并键入help('&')
或 help('|')
以获得有用的运算符表。
我对你投了反对票,因为在我看来你没有回答“这是什么意思”这个问题,但我猜主题启动器没有使用正确的词(如果他使用了“这些” ?)。
我先尝试了python.org,但找不到“|”。这是由于我自己的无知。正如我自己的经验所证明的那样,当有人发帖问什么“|”时我认为有理由假设他们可能不知道如何找到“|”在文档中。 “查看文档”不是答案,而是“查看文档:docs.python.org/2/library/stdtypes.html#index-19”。以上是关于Python 中使用的 & 和竖线字符在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
python使用matplotlib可视化线图(line plot)在可视化图像中的指定位置添加竖线自定义竖线的颜色自定义竖线的线型(add vertical line)
python使用matplotlib可视化线图(line plot)在可视化图像中的指定位置指定范围添加竖线自定义竖线的颜色自定义竖线的线型(add vertical line)