Имеет ли Python троичный условный оператор?
Да. Из файла грамматики :
test: or_test ['if' or_test 'else' test] | lambdef
Интересующая часть:
or_test ['if' or_test 'else' test]
Итак, троичная условная операция имеет вид:
expression1 if expression2 else expression3
expression3
будет лениво оцениваться (то есть оценивается, только если expression2
имеет значение false в логическом контексте). А из-за рекурсивного определения вы можете связывать их бесконечно (хотя это может считаться плохим стилем).
expression1 if expression2 else expression3 if expression4 else expression5 # and so on
Примечание по использованию:
Обратите внимание, что за каждым if
должен следовать else
. Люди, изучающие списки и выражения-генераторы, могут найти этот урок трудным для изучения - следующее не сработает, так как Python ожидает третьего выражения для else:
[expression1 if expression2 for element in iterable]
# ^-- need an else here
, что поднимает SyntaxError: invalid syntax
.
Таким образом, вышеприведенное является либо неполной частью логики (возможно, пользователь ожидает запрета в ложном состоянии), либо может быть предназначено для использования expression2 в качестве фильтра - отмечает, что следующее является допустимым Python:
[expression1 for element in iterable if expression2]
expression2
работает как фильтр для понимания списка и является не троичным условным оператором.
Альтернативный синтаксис для более узкого случая:
Вам может быть немного больно писать следующее:
expression1 if expression1 else expression2
expression1
нужно будет оценить дважды с использованием вышеуказанного использования. Это может ограничить избыточность, если это просто локальная переменная. Тем не менее, распространенная и эффективная идиома Pythonic для этого варианта использования заключается в использовании режима быстрого доступа or
:
expression1 or expression2
что эквивалентно по семантике. Обратите внимание, что некоторые руководства по стилю могут ограничивать это использование из соображений ясности - оно содержит много смысла в очень небольшом синтаксисе.