Да, он был добавлен в версии 2.5. Синтаксис выражения:
a if condition else b
Сначала condition вычисляется, затем вычисляется и возвращается ровно одно из a или b на основе логического значения condition. Если condition вычисляется как True, то a вычисляется и возвращается, но b игнорируется, или же когда b вычисляется и возвращается, но a игнорируется.
Это допускает короткое замыкание, потому что при condition значении true вычисляется только a и b не вычисляется вообще, но при condition значении false вычисляется только b и a не вычисляется вообще.
Обратите внимание, что условные выражения - это выражение, а не оператор. Это означает, что вы не можете использовать операторы, такие как pass, или присваивания с = (или "расширенные" присваивания, такие как +=), в условном выражении:
>>> # Python parses this as `x = (1 if False else y) = 2` >>> # The `(1 if False else x)` part is actually valid, but >>> # it can't be on the left-hand side of `=`. >>> x = 1ifFalseelse y = 2 File "<stdin>", line 1 SyntaxError: cannot assign to conditional expression
>>> # If we parenthesize it instead... >>> (x = 1) ifFalseelse (y = 2) File "<stdin>", line 1 (x = 1) ifFalseelse (y = 2) ^ SyntaxError: invalid syntax
(В версии 3.8 и выше, := оператор "walrus" позволяет просто присваивать значения в виде выражения, которое затем совместимо с этим синтаксисом. Но, пожалуйста, не пишите подобный код; это быстро станет очень трудным для понимания.)
Аналогично, поскольку это выражение, else часть является обязательной:
# Invalid syntax: we didn't specify what the value should be if the # condition isn't met. It doesn't matter if we can verify that # ahead of time. a ifTrue
Однако вы можете использовать условные выражения для присвоения переменной следующим образом:
x = a ifTrueelse b
Или, например, для возврата значения:
# Of course we should just use the standard library `max`; # this is just for demonstration purposes. defmy_max(a, b): return a if a > b else b
Представьте условное выражение как переключение между двумя значениями. Мы можем использовать его, когда находимся в ситуации "одно значение или другое", когда мы будем делать то же самое с результатом, независимо от того, выполнено ли условие. Мы используем выражение для вычисления значения, а затем что-то с ним делаем. Если вам нужно сделать что-то другое в зависимости от условия, то вместо этого используйте обычный ifоператор.
Имейте в виду, что некоторые питонисты не одобряют его по нескольким причинам:
Порядок аргументов отличается от классического condition ? a : b троичного оператора из многих других языков (таких как C , C ++, Go, Perl, Ruby, Java, JavaScript и т.д.), Что может приводить к ошибкам, когда люди, незнакомые с "удивительным" поведением Python, используют его (они могут изменить порядок аргументов на противоположный).
Некоторые считают его "громоздким", поскольку он противоречит нормальному ходу мыслей (сначала думается об условии, а затем о последствиях).
Стилистические соображения. (Хотя 'inline if' может быть действительно полезным и сделать ваш скрипт более кратким, он действительно усложняет ваш код)
Если у вас возникли проблемы с запоминанием порядка, то помните, что при чтении вслух вы (почти) говорите то, что имеете в виду. Например, x = 4 if b > 8 else 9 читается вслух как x will be 4 if b is greater than 8 otherwise 9.