Дополнительно
Есть ли в Python троичный условный оператор?
Если в Python нет троичного условного оператора, можно ли смоделировать его с помощью других языковых конструкций?
5549
20
Да, оно было добавлено в версии 2.5. Синтаксис выражения следующий:
Сначала оценивается
условие
, затем оценивается и возвращается ровно одно изa
илиb
на основе булевского значенияусловия
. Еслиcondition
имеет значениеTrue
, тоa
оценивается и возвращается, аb
игнорируется, или иначе, когдаb
оценивается и возвращается, аa
игнорируется.Это позволяет осуществлять короткое замыкание, потому что когда
условие
истинно, оценивается толькоa
, аb
не оценивается вообще, а когдаусловие
ложно, оценивается толькоb
, аa
не оценивается вообще.Например:
Обратите внимание, что условные выражения - это выражение, а не заявление. Это означает, что вы не можете использовать операторы присваивания,
pass
или другие выражения внутри условного выражения:Однако вы можете использовать условные выражения для присвоения переменной, например, так:
Думайте об условном выражении как о переключении между двумя значениями. Оно очень полезно, когда вы находитесь в ситуации 'одно значение или другое', но оно не делает многого другого.
Если вам нужно использовать операторы, вы должны использовать обычное
if
выражение вместо условного выражения.Имейте в виду, что некоторые Pythonисты не одобряют это по нескольким причинам:
condition ? a : b
из многих других языков (таких как C, C++, Go, Perl, Ruby, Java, Javascript и т.д.), что может привести к ошибкам, когда люди, незнакомые с "удивительным" поведением Python, используют его (они могут изменить порядок аргументов).if
' может быть очень полезным и сделать ваш сценарий более лаконичным, он действительно усложняет ваш код).Если вам трудно запомнить порядок, то помните, что при чтении вслух вы (почти) говорите то, что имеете в виду. Например,
x = 4 if b > 8 else 9
будет прочитано вслух какx будет 4, если b больше 8, иначе 9
.Официальная документация:
Вы можете индексировать в кортеж:
test
должен вернуть True или False. Может быть безопаснее всегда реализовывать это как:или вы можете использовать встроенный
bool ()
, чтобы обеспечить значение Boolean:Для версий, предшествующих 2.5, есть одна хитрость:
Это может дать неверные результаты, когда
on_true
имеет булево значение false.1 Хотя у него есть преимущество в том, что он оценивает выражения слева направо, что, на мой взгляд, более понятно.< код > < i > < выражение 1 > < / i > < b > / b > < i > < условие > < / i > < b >
Из [документации]:
Новое с версии 2.5.
Оператор для условного выражения в Python был добавлен в 2006 году как часть Python Enhancement Proposition 308. Его форма отличается от общей
?:
Оператор и это:что эквивалентно:
Вот пример:
Другой синтаксис, который можно использовать (совместимый с версиями до 2.5):
где операнды лазильно оценены.
Другой способ - индексировать кортеж (который не согласуется с условным оператором большинства других языков):
или явно построенный словарь:
Другой (менее надежный), но более простой метод - использовать операторы
и
иили
:однако это не сработает, если
x
будетFalse
.Возможный обходной путь - создание списков или кортежей
x
иy
, как указано ниже:или:
Если вы работаете со словарями, вместо использования троичного условного, вы можете воспользоваться
get (key, default)
, например:Источник: ?: в Python в Википедии < / sup >
К сожалению,
Решение не имеет поведения короткого замыкания; таким образом,
falseValue
иtrueValue
оцениваются независимо от состояния. Это может быть неоптимальным или даже глючным (т.е. обаtrueValue
иfalseValue
могут быть методами и иметь побочные эффекты).Одним из решений этого было бы
(исполнение задерживается до тех пор, пока победитель не станет известен;)), но оно вводит несоответствие между вызываемыми и не вызываемыми объектами. Кроме того, это не решает случай при использовании свойств.
И так, история гласит: выбор между 3 упомянутыми решениями - это компромисс между наличием функции короткого замыкания, использующей, по крайней мере, Zython 2.5 (ИМХО больше не проблема) и не склонной к «trueValue» -оценкам -false "ошибки.
Последовательный оператор на разных языках программирования
Здесь я просто пытаюсь показать некоторые важные различия в «постоянном операторе» между парой языков программирования.
Для Python 2.5 и новее существует определенный синтаксис:
У старых Питонов троичный оператор не реализован, но его можно смоделировать.
Тем не менее, существует потенциальная проблема, которая, если
cond
оценивается какTrue
иon_true
, оценивается какFalse
, тогдаon_false
возвращается вместоon_true
. Если вы хотите это поведение, метод в порядке, в противном случае используйте это:который может быть обернут:
и использовал этот способ:
Он совместим со всеми версиями Python.
Вы можете часто найти
но это приводит к проблеме, когда on_true == 0
где вы ожидаете для нормального троичного оператора этот результат
Да. Из файла грамматики:
Часть интереса:
Итак, троичная условная операция имеет вид:
expression3
будет лениво оцениваться (то есть оцениваться только в том случае, еслиexpression2
является ложным в логическом контексте). И из-за рекурсивного определения вы можете связать их бесконечно (хотя это может считаться плохим стилем.)Примечание об использовании:
Обратите внимание, что за каждым
if
должен следоватьelse
. Люди, изучающие списки и выражения генераторов, могут посчитать это трудным уроком для изучения - следующее не будет работать, так как Python ожидает третье выражение для другого:который поднимает
SyntaxError: неверный синтаксис
. Таким образом, вышеизложенное является либо неполной частью логики (возможно, пользователь ожидает отсутствия операции в ложном состоянии), либо можно использовать выражение 2 в качестве фильтра - отмечает, что следующим является законный Python:expression2
работает как фильтр для понимания списка и не является * троичным условным оператором.Альтернативный синтаксис для более узкого случая:
Вам может быть несколько больно писать следующее:
expression1
придется оценивать дважды с вышеуказанным использованием. Это может ограничить избыточность, если это просто локальная переменная. Тем не менее, общая и эффективная питонская идиома для этого варианта использования состоит в том, чтобы использовать сокращающее поведениеor
:что эквивалентно в семантике. Обратите внимание, что некоторые руководства по стилю могут ограничивать это использование из-за ясности - оно имеет большое значение в очень малом синтаксисе.
Моделирование троичного оператора питона.
Например
вывод:
Вы можете сделать это :-
[условие] и [expression_1] или [expression_2];
Пример: -
print (число% 2 и "странный" или "четный")
Это напечатало бы «странно», если число нечетное, или «четное», если число четное.
Результат: - Если условие истинно, выполняется exp_1, иначе выполняется exp_2.
Примечание: - 0, Нет, Ложь, emptylist, emptyString оценивается как Ложь. И любые данные, кроме 0, оцениваются как True.
Вот как это работает:
если условие [условие] становится «Истинным», то будет оцениваться выражение_1, но не выражение_2 . Если мы «и» что-то с 0 (ноль), результат всегда будет слабым. Так в приведенном ниже утверждении
Выражение exp вообще не будет оцениваться, поскольку «и» с 0 всегда будет оцениваться до нуля, и нет необходимости оценивать выражение . Так работает сам компилятор на всех языках.
В
выражение exp не будет оцениваться вообще, так как «или» с 1 всегда будет 1. Таким образом, не будет беспокоить оценку выражения exp, так как результат будет 1 в любом случае . (методы оптимизации компилятора).
Но в случае
Второе выражение exp2 не будет оцениваться, поскольку
True и exp1
будут True, когда exp1 не является ложным .Точно так же в
Выражение exp1 не будет оцениваться, поскольку False эквивалентно написанию 0, а выполнение «и» с 0 само по себе будет равно 0, но после exp1, поскольку используется «или», оно оценит выражение exp2 после «или» .
Примечание: - Этот вид ветвления с использованием «или» и «и» может использоваться только в том случае, если выражение_1 не имеет значения Истины False (или 0 или None или emptylist [] или emptystring ''.) поскольку, если выражение_1 становится ложным, выражение_2 будет оцениваться из-за присутствия «или» между exp_1 и exp_2.
Если вы все еще хотите, чтобы это работало для всех случаев, независимо от того, каковы значения истинности exp_1 и exp_2, сделайте это: -
[условие] и ([expression_1] или 1) или [expression_2];
Терничный условный оператор просто позволяет протестировать условие в одной строке, заменяя многострочный if-else, делая код компактным.
Синтаксис:
1- Простой метод использования троичного оператора:
2- Прямой метод использования кортежей, словаря и лямбды:
3- Поперечный оператор может быть написан как вложенный if-else:
Выше подход можно записать как:
Больше подсказки, чем ответа (не нужно повторять очевидное в течение времени), но я иногда использую его как ярлык на сайте в таких конструкциях:
, становится:
Некоторые (многие :) могут осуждать это как непитоническое (даже рубиновое :), но я лично нахожу это более естественным - т.е. как бы вы это выразили нормально, плюс немного более визуально привлекательным в больших блоках кода.
Просто запомните эту пирамиду, если у вас возникли проблемы с запоминанием:
Многие языки программирования, полученные из
C
, обычно имеют следующий синтаксис троичного условного оператора:Итак, во-первых, он оценивает состояние. Если он вернет
True
, expression1 будет оценен, чтобы дать результат, в противном случае expression2 будет оценен. Из-за механики Ленивая оценка - будет выполнено только одно выражение.Вот несколько примеров (условия будут оцениваться слева направо):
Последовательные операторы могут быть объединены в последовательные последовательные последовательности:
Следующий такой же, как предыдущий:
Надеюсь, это поможет.
ДА, у питона есть троичный оператор, вот синтаксис и пример кода, чтобы продемонстрировать то же самое :)
Одна из альтернатив Python [условное выражение][1] заключается в следующем:
который имеет следующее приятное расширение:
Кратчайший альтеративный остаток:
но альтернативы нет, если вы хотите избежать оценки
yes ()
иno ()
в следующем:[1]: https://mail.python.org/pipermail/python-dev/2005-сентябрь / 056846.html
Как уже было сказано, да, в питоне есть троичный оператор
Дополнительная информация:
Если
< выражение 1 >
- это условие, которое вы можете использовать Оценка короткого замыкания:PS: Конечно, оценка короткого замыкания не является троичным оператором, но часто троичный используется в тех случаях, когда короткого замыкания будет достаточно.