По некоторым причинам эта функция смутила меня:
def protocol(port):
return port == "443" and "https://" or "http://"
Может кто-то объяснять порядок того, что, оказывается, негласно делает эту работу путем, это делает.
Я понял это как это, пока я не попробовал его:
Любой A)
def protocol(port):
if port == "443":
if bool("https://"):
return True
elif bool("http://"):
return True
return False
Или B)
def protocol(port):
if port == "443":
return True + "https://"
else:
return True + "http://"
Этот своего рода особый случай в Python, или я полностью неправильно понимаю, как операторы работают?
Это старая идиома; вставляя скобки, чтобы показать приоритет,
(port == "443" and "https://") or "http://"
x и y
возвращает y
, если x
истинно, x
, если x
ложно; a или b
, наоборот, возвращает a
, если оно истинно, иначе b
.
Таким образом, если port == "443"
истинно, возвращается RHS из а
, т.е. "https://"
. В противном случае и
ложно, поэтому в игру вступает или
и возвращает `"http://", его RHS.
В современном Python лучше перевести эту старую идиому так:
"https://" if port == "443" else "http://"
Вы можете прочитать об «и / или трюке» Python в этой статье Своеобразная природа And и Or в Python . Это немного похоже на IIF ()
в VBA или VB или ?:
в языках C-стиля.
Эта конструкция работает, потому что она «разворачивается» до следующего кода:
a и b ->
if a:
return b
else:
return a
a или b ->
if a:
return a
else:
return b
C и X или Y
- это давняя ранняя попытка пользователей Python прокси для C? X: Y
По большей части это работает, за исключением , если X
равно False
- это привело к множеству ошибок в коде Python, поэтому в в FAQ по Python , вы найдете более правильное решение: (C и [X] или [Y]) [0]
, потому что список с одним элементом, независимо от его вычисленное логическое значение, всегда True
! Например: [Нет]
равно Истинно
, но Нет
- нет. Пример OP выше работает, потому что строка, представляющая X
, не пуста.
Однако все это изменилось в Python 2.5, когда в язык был добавлен тернарный или условный оператор, что позволило вам использовать очиститель X if C else Y
, как указано в других сообщениях здесь. Если вы видите код, использующий старый формат, это потому, что пользователь долгое время был программистом на Python, который еще не принял новый синтаксис, он вырезал и вставил другой старый код, или их работодатель все еще использует 2.4.x ( или более ранние выпуски) и т. д.
and
возвращает правый операнд, если левый истинен. or
возвращает правый операнд, если левый ложен. В противном случае они оба возвращают левый операнд. Считается, что они коалесцируют.
Это уродливое решение, использование которого не рекомендуется. Это работает из-за поведения короткого замыкания ,
и или
и того, что они возвращают один из своих аргументов, а не логическое значение. Использование этой техники может привести к появлению труднообнаруживаемых ошибок, поэтому не используйте ее в новом коде.
Вот пример того, как идиома и / или
может дать неожиданный результат:
>>> foo = 'foobar'
>>> bar = 'foobar'
>>> x = 0
>>> y = 1
>>> (foo == bar) and x or y # Will this return the value of x if (foo == bar)?
1
Вместо этого отдайте предпочтение более новой нотации:
return "https://" if port == "443" else "http://"