сложный оператор if в python - PullRequest
30 голосов
/ 22 марта 2010

Мне нужно реализовать сложный оператор if-elif-else в Python, но я не получаю его.

Нужная мне строка elif должна проверить переменную для следующих условий:

80, 443 или 1024-65535 включительно

Я пытался

if
  ...
  # several checks
  ...
elif (var1 > 65535) or ((var1 < 1024) and (var1 != 80) and (var1 != 443)):
  # fail
else
  ...

Ответы [ 7 ]

44 голосов
/ 22 марта 2010

Это должно сделать это:

elif var == 80 or var == 443 or 1024 <= var <= 65535:
17 голосов
/ 22 марта 2010

Часто проще думать в позитивном смысле и оборачивать это не так:

elif not (var1 == 80 or var1 == 443 or (1024 <= var1 <= 65535)):
  # fail

Конечно, вы также можете сделать все возможное и быть более объектно-ориентированным:

class PortValidator(object):
  @staticmethod
  def port_allowed(p):
    if p == 80: return True
    if p == 443: return True
    if 1024 <= p <= 65535: return True
    return False


# ...
elif not PortValidator.port_allowed(var1):
  # fail
7 голосов
/ 22 марта 2010
if x == 80 or x == 443 or 1024 <= x <= 65535

определенно должен сделать

4 голосов
/ 22 марта 2010

Я думаю, что самый питонский способ сделать это для меня будет

elif var in [80,443] + range(1024,65535):

хотя это может занять немного времени и памяти (генерирует числа от 1024 до 65535). Если с этим возникнет проблема, я сделаю:

elif 1024 <= var <= 65535 or var in [80,443]:
2 голосов
/ 22 марта 2010
if
  ...
  # several checks
  ...
elif not (1024<=var<=65535 or var == 80 or var == 443)
  # fail
else
  ...
1 голос
/ 14 декабря 2016

Можно написать так:

elif var1 in [80, 443] or 1024 < var1 < 65535

Таким образом вы проверяете, появляется ли var1 в этом списке, затем вы делаете только 1 проверку, не повторяете «var1» один раз и выглядите ясно:

если var1 в [80, 443] или 1024 хороший

0 голосов
/ 22 марта 2010
if
  ...
  # several checks
  ...
elif ((var1 > 65535) or ((var1 < 1024)) and (var1 != 80) and (var1 != 443)):
  # fail
else
  ...

Вы пропустили скобку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...