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

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

22
задан SilentGhost 8 January 2010 в 11:57
поделиться

5 ответов

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

  • если левый аргумент к и вычисляется к False, то правый аргумент вообще не вычисляется
  • , если левый аргумент к или вычисляется к 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

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

44
ответ дан 29 November 2019 в 04:12
поделиться

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

1
ответ дан 29 November 2019 в 04:12
поделиться

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

1
ответ дан 29 November 2019 в 04:12
поделиться

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

0
ответ дан 29 November 2019 в 04:12
поделиться

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

Источник: PEP 335

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

5
ответ дан 29 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: