Круглые скобки в условиях 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
Может ли кто-нибудь помочь пролить свет на это? Являются ли их случаи, когда я определенно их использую?
Ответы
Ответ 1
Другие ответы, что сравнение происходит до того, как Boolean на 100% правильны. В качестве альтернативы (для ситуаций, подобных тому, что вы продемонстрировали) вы также можете использовать это как способ сочетания условий:
if socket.gethostname() in ('bristle', 'rete'):
# Something here that operates under the conditions.
Это избавляет вас от отдельных вызовов socket.gethostname и упрощает добавление дополнительных допустимых значений по мере роста вашего проекта или для авторизации дополнительных хостов.
Ответ 2
Скобки в этом случае избыточны. Сравнение имеет более высокий приоритет, чем булевы операторы, поэтому сравнения всегда будут выполняться сначала независимо от круглых скобок.
Тем не менее, руководство, которое я когда-то видел (возможно, в Практическом программировании на С), сказал следующее:
- Умножение и деление сначала
- Добавление и вычитание следующего
- Скобки вокруг всего остального
(Да, IIRC они исключили возведение в степень!)
Идея состоит в том, что правила приоритета достаточно загадочны, и никто не должен их помнить, ни первоначальный программист, ни программист по обслуживанию, читающий код, поэтому лучше сделать его явным. По сути, круглые скобки служат как для передачи намерения компилятору, так и для документации для следующего schmoe, который должен работать над ним.
Я верю в Python, что эти два оператора будут генерировать один и тот же байт-код, чтобы вы даже не теряли эффективности.
Ответ 3
Скобки просто заставляют порядок операций. Если бы у вас была дополнительная роль в вашем условном выражении, например "и", было бы целесообразно использовать скобки для указания того, к какому 'или' этому 'и' в паре с.
if (socket.gethostname() == "bristle" or socket.gethostname() == "rete") and var == condition:
...
Чтобы отличить от
if socket.gethostname() == "bristle" or (socket.gethostname() == "rete" and var == condition):
...
Ответ 4
В Python и многих других языках программирования скобки не требуются для каждого выражения с несколькими операторами. Это связано с тем, что операторы имеют определенный приоритет. См. Таблицу здесь (раздел 5.15) для получения информации о приоритете оператора в Python.
Вы можете провести аналогию с арифметикой. Эти выражения эквивалентны:
5 * 5 + 3
(5 * 5) + 3
Если вы хотите добавить три первых, то вам нужно использовать круглые скобки, например:
5 * (5 + 3)
Ответ 5
Посмотрите руководство. Чем выше вы находитесь в списке, оператор будет применяться позже. "или" находится выше "==", и поэтому в этом конкретном случае ответы одинаковы. Однако для удобочитаемости и, конечно, я бы рекомендовал скобки.