Почему в Python нет операторов "и" и "или"?

Я не знал об этом, но, по-видимому, ключевые слова and и or не являются операторами. Они не отображаются в списке операторов python. Почему же это из-за чистого любопытства? И если они не являются операторами, что именно они?

Ответ 1

Потому что они являются конструкциями потока управления. В частности:

  • если левый аргумент 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

Как вы видите, побитовое ИЛИ (|) оценивает оба своих аргумента. Однако ключевое слово or не оценивает его правый аргумент вообще, когда левый аргумент оценивается как True; что почему во втором выражении не возникает ZeroDivisionError.

Ответ 2

В настоящее время Python не предоставляет специальных xxx специальных методов, соответствующих операторам 'и', 'или' и 'not' boolean. В случае "и" и "или" наиболее вероятной причиной является то, что эти операторы имеют короткозамкнутую семантику, т.е. Второй операнд не оценивается, если результат может быть определен из первого операнда. Поэтому обычная техника предоставления специальных методов для этих операторов не будет работать.

Источник: PEP 335

PEP 335 говорит о добавлении возможности иметь перегружаемых операторов и немного обсуждает эту проблему.

Ответ 3

Они классифицируют их как ключевые слова ранее в документе.

Ответ 4

Они keywords, потому что они зарезервированные идентификаторы, а не специальные маркеры символов.

Ответ 5

Они не могут быть переопределены для поддержки операций типа, поэтому они не подпадают под сферу действия других операторов.