Почему в Python нет операторов «и» и «или»? - PullRequest
22 голосов
/ 07 января 2010

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

Ответы [ 6 ]

44 голосов
/ 07 января 2010

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

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

5 голосов
/ 07 января 2010

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

Источник: PEP 335

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

1 голос
/ 07 января 2010

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

1 голос
/ 07 января 2010

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

0 голосов
/ 19 октября 2018

Список, который вы просматриваете, находится в разделе документации, описывающей лексическую структуру 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 считаются операторами. Например, они перечислены в столбце «Оператор» в таблице приоритетов операторов .

0 голосов
/ 07 января 2010

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

...