Как делают “и” и “или” работают при объединении в одном операторе?

По некоторым причинам эта функция смутила меня:

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, или я полностью неправильно понимаю, как операторы работают?

7
задан Abel 5 April 2010 в 17:55
поделиться

6 ответов

Это старая идиома; вставляя скобки, чтобы показать приоритет,

(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://"
24
ответ дан 6 December 2019 в 05:03
поделиться

Вы можете прочитать об «и / или трюке» Python в этой статье Своеобразная природа And и Or в Python . Это немного похоже на IIF () в VBA или VB или ?: в языках C-стиля.

1
ответ дан 6 December 2019 в 05:03
поделиться

Эта конструкция работает, потому что она «разворачивается» до следующего кода:

a и b ->

if a:
  return b
else:
  return a

a или b ->

if a:
  return a
else:
  return b
0
ответ дан 6 December 2019 в 05:03
поделиться

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 ( или более ранние выпуски) и т. д.

5
ответ дан 6 December 2019 в 05:03
поделиться

and возвращает правый операнд, если левый истинен. or возвращает правый операнд, если левый ложен. В противном случае они оба возвращают левый операнд. Считается, что они коалесцируют.

8
ответ дан 6 December 2019 в 05:03
поделиться

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

Вот пример того, как идиома и / или может дать неожиданный результат:

>>> 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://"
2
ответ дан 6 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: