为什么Python中没有"和"和"或"运算符?

Jas*_*ker 22 python boolean language-design operators keyword

我没有意识到这一点,但显然andor关键字不是运营商.它们不会出现在python运算符列表中.出于纯粹的好奇心,这是为什么?如果他们不是运营商,他们究竟是什么?

Ant*_* P. 44

因为它们是控制流构造.特别:

  • 如果左参数的and计算结果为False,则右参数根本不会被评估
  • 如果左参数的or计算结果为True,那么右参数根本不会被评估

因此,这不仅仅是保留词的问题.它们的行为与运算符不同,因为运算符总是会评估它们的所有参数.

你可以将它与按位二元运算符进行对比,顾名思义就是这样运算符:

>>> 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
Run Code Online (Sandbox Code Playgroud)

如您所见,按位OR(|)计算其参数.该or关键词,但是,不会在所有的时候左边参数值为True评价其右边的参数; 这就是为什么ZeroDivisionError在第二个声明中没有提出的原因.

  • 注意,在C中,`&&`和`||`被称为"运算符",即使它们是短路的(根据左侧的值不评估右侧).对于其他一些语言也是如此 (12认同)
  • 是的,我同意术语可能会有所不同。但主要的一点是,它们与 Python 通常所说的运算符有着根本不同的特征。 (2认同)
  • 这不是原因。如果这是原因,那么像 `in` 这样的操作符就会出现在列表中。`and`、`or` 和所有其他由字母组成的操作符不在操作符列表中,因为该列表是关于 Python 词法结构中的标记分类,而由字母组成的标记都被归类为标识符或关键字,而不管它们的语义作用。 (2认同)
  • 在 * 不* 谈论令牌结构的部分文档中,例如 [operator precedence table](https://docs.python.org/3/reference/expressions.html#operator-precedence),`和` 和 `or` 被归类为运算符。 (2认同)

Set*_*eth 5

Python目前不提供与'and','或'和'not'布尔运算符对应的任何' xxx '特殊方法.在'and'和'or'的情况下,最可能的原因是这些运算符具有短路语义,即如果可以从第一个操作数确定结果,则不评估第二个操作数.因此,为这些操作员提供特殊方法的常用技术是行不通的.

资料来源:PEP 335

PEP 335讨论了增加具有可重载运算符的能力,并讨论了这个问题.