скобки в Python условия
у меня есть простой вопрос относительно использования круглых скобок в условных операторах Python.
следующие два фрагмента работают одинаково, но мне интересно, верно ли это только из-за его простоты;
>>> import os, socket
>>> if ((socket.gethostname() == "bristle") or (socket.gethostname() == "rete")):
... DEBUG = False
... else:
... DEBUG = True
...
>>> DEBUG
а теперь без скобок
>>> import os, socket
>>> if socket.gethostname() == "bristle" or socket.gethostname() == "rete":
... DEBUG = False
... else:
... DEBUG = True
...
>>> DEBUG
кто-нибудь может помочь пролить свет на это? Есть ли какие-то случаи, когда я должен использовать их?
5 ответов
другие ответы, которые сравнение происходит до логического, являются 100% правильными. В качестве альтернативы (для ситуаций, подобных тому, что вы продемонстрировали) вы также можете использовать это как способ объединения условий:
if socket.gethostname() in ('bristle', 'rete'):
# Something here that operates under the conditions.
это экономит вам отдельные вызовы сокета.gethostname и упрощает добавление дополнительных допустимых значений по мере роста проекта или авторизации дополнительных хостов.
в этом случае скобки являются избыточными. Сравнение имеет более высокий приоритет, чем логические операторы, поэтому сравнения всегда будут выполняться первыми, независимо от круглых скобок.
тем не менее, руководство, которое я когда-то видел (возможно, в Практическое Программирование C) сказал что-то вроде этого:
- умножение и деление "первый"!--8-->
- сложение и вычитание следующее
- скобки все иначе!--8-->
(да, IIRC они оставили экспоненциальность!)
идея заключается в том, что правила приоритета достаточно загадочны, что никто не должен помнить их все, ни исходный программист, ни программист обслуживания, читающий код, поэтому лучше сделать его явным. По сути, в скобках служить и общаться намерением компилятор и документация к следующей schmoe, кто работает на нем.
Я верю в Python эти два оператора будут генерировать один и тот же байт-код, поэтому вы даже не потеряете эффективность.
скобки просто заставляют порядок операций. Если у вас есть дополнительная часть в вашем условном выражении, например "и", было бы целесообразно использовать скобки, чтобы указать, какие " или " это " и " в паре С.
if (socket.gethostname() == "bristle" or socket.gethostname() == "rete") and var == condition:
...
В отличие от
if socket.gethostname() == "bristle" or (socket.gethostname() == "rete" and var == condition):
...
в Python и многих других языках программирования скобки не требуются для каждого выражения с несколькими операторами. Это происходит потому, что операторы имеют определенный приоритет. Смотрите таблицу здесь (раздел 5.15) для получения информации о приоритет операторов в Python.
можно провести аналогию с арифметикой. Эти выражения эквивалентны:
5 * 5 + 3
(5 * 5) + 3
Если вы хотите добавить три первых, то вам нужно использовать круглые скобки, такие как это:
5 * (5 + 3)
посмотреть руководство. Чем выше вы находитесь в списке, тем позже будет применен оператор. "или " выше"==", и поэтому в данном конкретном случае ответы одинаковы. Однако для удобства чтения и, чтобы быть уверенным, я бы рекомендовал скобки.