круглые скобки в Python Conditionals - PullRequest
24 голосов
/ 19 января 2011

У меня простой вопрос об использовании скобок в условных выражениях 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 ]

37 голосов
/ 19 января 2011

Другие ответы, что Сравнение имеет место до логического значения, являются на 100% правильными. В качестве альтернативы (для ситуаций, подобных тому, что вы продемонстрировали), вы также можете использовать это как способ объединения условий:

if socket.gethostname() in ('bristle', 'rete'):
  # Something here that operates under the conditions.

Это экономит отдельные вызовы socket.gethostname и упрощает добавление дополнительных возможных допустимых значений по мере роста вашего проекта или необходимости авторизации дополнительных хостов.

9 голосов
/ 19 января 2011

В этом случае круглые скобки являются избыточными.Сравнение имеет более высокий приоритет, чем булевы операторы, поэтому сравнения всегда будут выполняться первыми, независимо от скобок.

Тем не менее, руководство, которое я когда-то видел (возможно, в Практическое программирование на С), сказалчто-то вроде этого:

  1. Сначала умножение и деление
  2. Сложение и вычитание далее
  3. Скобки вокруг всего остального

(Да, IIRCони упустили возведение в степень!)

Идея состоит в том, что правила предшествования достаточно загадочны, поэтому никто не должен запоминать их все, ни программист-программист, ни программист-техник, читающий код, поэтому лучше сделатьэто явно.По сути, круглые скобки служат как для сообщения о намерении компилятору, так и в качестве документации для следующего schmoe, который должен над ним работать.

Я считаю, что в Python эти два оператора генерируют один и тот же байт-код, так что вы даже нетеряя эффективность.

8 голосов
/ 19 января 2011

В скобках просто указан порядок операций.Если у вас есть дополнительная часть в вашем условном выражении, такая как 'и', было бы целесообразно использовать круглые скобки, чтобы указать, с каким 'или' этим 'и' в сочетании с.

if (socket.gethostname() == "bristle" or socket.gethostname() == "rete") and var == condition:
    ...

Чтобы отличить от

if socket.gethostname() == "bristle" or (socket.gethostname() == "rete" and var == condition):
    ...
2 голосов
/ 19 января 2011

В Python и многих других языках программирования круглые скобки не требуются для каждого выражения с несколькими операторами.Это потому, что операторы имеют определенный приоритет.См. Таблицу здесь (раздел 5.15) для получения информации о приоритете операторов в Python.

Можно провести аналогию с арифметикой.Эти выражения эквивалентны:

5 * 5 + 3

(5 * 5) + 3

Если вы хотите сначала добавить три, то вам нужно использовать круглые скобки, например:

0 голосов
/ 19 января 2011

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

...