Есть ли в Python тернарный условный оператор?
Есть ли в Python тернарный оператор?
Примечание. Это перевод замечательного вопроса с enSO Does Python have a ternary conditional operator?
Есть ли в Python тернарный оператор?
Примечание. Это перевод замечательного вопроса с enSO Does Python have a ternary conditional operator?
Да, он был добавлен в версии 2.5. Вот его синтаксис:
a if condition else b
Сначала вычисляется condition
, затем, в соответствии с его булевым значением, вычисляется и возвращается a
или b
. Если condition
равно True, вычисляется и возвращается a
, а b
игнорируется; в противном случае вычисляется и возвращается b
, а a
игнорируется.
Это позволяет провести так называемое сокращенное вычисление: когда условие истинно — вычисляется только a
, а когда условие ложно — вычисляется только b
(налицо экономия времени).
Например:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Заметьте, что тернарный оператор — это выражение (expression), а не инструкция (statement). Это означает, что вы не можете использовать инструкции (вроде pass
) или присваивания (x = 5
, x += 5
) внутри условного оператора:
>>> pass if False else pass
File "<stdin>", line 1
pass if False else pass
^
SyntaxError: invalid syntax
>>> # Python обрабатывает это как `x = (1 if False else y) = 2`
>>> # Часть `(1 if False else x)` верна, но
>>> # она не может быть слева от знака равенства.
>>> x = 1 if False else y = 2
File "<stdin>", line 1
SyntaxError: cannot assign to conditional expression
>>> # То же, но со скобками...
>>> (x = 1) if False else (y = 2)
File "<stdin>", line 1
(x = 1) if False else (y = 2)
^
SyntaxError: invalid syntax
(В версии 3.8 и выше "моржовый оператор" :=
позволяет одновременно вычислить выражение, присвоить результат переменной, и вернуть это значение куда угодно, в том числе и в условие тернарного оператора. Но не стоит этим увлекаться — слишком быстро станет трудно разобраться в коде.)
Кроме того, поскольку это выражение, то часть else
обязательна:
# Неверный синтаксис: мы не определили, какое будет значение, если
# условие окажется ложным.
a if True
Однако вы можете использовать тернарный оператор для присваивания значения переменной таким образом:
x = a if True else b
Или, например, в комбинации с оператором return:
def my_max(a, b):
return a if a > b else b
О тернарном выражении следует думать как о "переключении" между двумя значениями. Его следует использовать, когда перед нами выбор одного из двух значений, а дальнейшие строки программы выполнятся вне зависимости от того, будет ли условие верно. Тернарный оператор используется, когда мы хотим вычислить выражение и потом что-то с ним сделать. В остальных случаях применяйте обычный if
.
Имейте в виду, что некоторые питонисты недолюбливают тернарный оператор по следующим причинам:
Порядок аргументов отличается от аналогичного классического тернарного оператора condition ? a : b
многих других языков (например, C, C++, Go, Perl, Ruby, Java, JavaScript и т. д.). Это может привести к ошибкам, если человек незнаком с "необычным" поведением Питона в отношении тернарного оператора (он может перепутать порядок аргументов).
Некоторые находят его неуклюжим, поскольку он идет вразрез с обычным ходом мысли (сначала об условии, а потом о действиях).
Хотя "однострочный if" может быть очень полезен и делает код более лаконичным, он сильно его усложняет.
Если вам трудно запомнить порядок аргументов, то вспомните, что если произнести выражение с тернарным оператором вслух, получится примерно то же, что оператор и обозначает. Например, x = 4 if b > 8 else 9
произносится как x будет равно 4, если b больше чем 8, в противном случае 9
.
Официальная документация: