скобки в 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) сказал что-то вроде этого:

  1. умножение и деление "первый"!--8-->
  2. сложение и вычитание следующее
  3. скобки все иначе!--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)

посмотреть руководство. Чем выше вы находитесь в списке, тем позже будет применен оператор. "или " выше"==", и поэтому в данном конкретном случае ответы одинаковы. Однако для удобства чтения и, чтобы быть уверенным, я бы рекомендовал скобки.