Ответ 1
Это должно сделать это:
elif var == 80 or var == 443 or 1024 <= var <= 65535:
Мне нужно реализовать сложный оператор 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
...
Это должно сделать это:
elif var == 80 or var == 443 or 1024 <= var <= 65535:
Часто легче думать в положительном смысле и обернуть его не в:
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
if x == 80 or x == 443 or 1024 <= x <= 65535
обязательно должен
Я думаю, что самый питонический способ сделать это для меня будет
elif var in [80,443] + range(1024,65535):
хотя это может занять немного времени и памяти (он генерирует числа от 1024 до 65535). Если с этим возникнет проблема, я сделаю следующее:
elif 1024 <= var <= 65535 or var in [80,443]:
if
...
# several checks
...
elif not (1024<=var<=65535 or var == 80 or var == 443)
# fail
else
...
Можно написать так:
elif var1 in [80, 443] or 1024 < var1 < 65535
Таким образом вы проверяете, появляется ли в этом списке var1, вы делаете всего 1 чек, не повторяете лишнее время "var1" и выглядите ясно:
если var1 в [80, 443] или 1024 < var1 < 65535: печатать "хорошо"
еще: печатать 'плохо' ....:
хороший
if
...
# several checks
...
elif ((var1 > 65535) or ((var1 < 1024)) and (var1 != 80) and (var1 != 443)):
# fail
else
...
Вы пропустили круглую скобку.