为什么Python中没有“和”和“或”运算符?
我之前并不知道这一点,但显然在Python中,and
和or
这两个关键词并不是操作符。它们在Python操作符的列表中并没有出现。出于好奇,为什么会这样呢?如果它们不是操作符,那它们到底是什么呢?
6 个回答
2
你现在看到的这个列表是在文档中描述Python的词法结构的部分:也就是Python代码由哪些类型的符号组成。根据词法结构,所有看起来像标识符的符号都被归类为标识符或关键字,不管它们在代码中具体的作用是什么。这包括所有由字母组成的符号。
and
和or
出现在关键字符号列表中,而不是运算符符号列表,因为它们是由字母组成的:
False await else import pass
None break except in raise
True class finally is return
and continue for lambda try
as def from nonlocal while
assert del global not with
async elif if or yield
如果它们的写法是&&
和||
,而不是and
和or
,那么它们就会出现在运算符符号列表中。
在文档的其他部分,如果不讨论词法结构,and
和or
就被视为运算符。例如,它们在运算符优先级表的运算符列中列出。
5
Python目前没有提供任何与'and'、'or'和'not'这三个布尔运算符对应的特殊方法。对于'and'和'or',最可能的原因是这些运算符有短路求值的特性,也就是说,如果第一个操作数已经能决定结果,那么第二个操作数就不会被计算。因此,通常为这些运算符提供特殊方法的做法就不适用了。
来源:PEP 335
PEP 335讨论了增加可重载运算符的能力,并对此问题进行了简要讨论。
44
因为它们是控制流程的结构。具体来说:
- 如果
and
左边的条件是假的,右边的条件根本不会被计算 - 如果
or
左边的条件是真的,右边的条件也不会被计算
所以,这不仅仅是因为它们是保留字。它们的行为和运算符不一样,因为运算符总是会计算它们所有的参数。
你可以把它和位运算符对比,顾名思义,位运算符就是运算符:
>>> 1 | (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> 1 or (1/0)
1
如你所见,位或运算符(|
)会计算它的两个参数。而or
这个关键词,当左边的条件为真时,右边的条件根本不会被计算;这就是为什么在第二个语句中没有出现ZeroDivisionError
错误。