Тернарный условный оператор. Вложенное тернарное условие

Курс по Python: https://stepik.org/course/100707

На этом занятии по курсу языка Python мы поговорим о тернарном условном операторе, который появился в версии 2.5. Как всегда, вначале поясню, что это за оператор. В простейшем варианте его синтаксис можно представить так:

<значение 1> if <условие> else <значение 2>

Он возвращает значение 1, если условие истинно, а иначе – значение 2. Давайте поясню его работу на конкретном примере. Предположим, у нас имеются две переменные:

a = 12
b = 7

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

if a > b:
    res = a
else:
    res = b
 
print(res)

А с использованием тернарного оператора это можно реализовать так:

res = a if a > b else b

Видите, какая простая, понятная и компактная запись в итоге получилась. Это одно из удобств данного оператора. Но, все же, между предыдущей программой с условным оператором if и тернарным оператором есть одно принципиальное отличие. Тернарный оператор автоматически возвращает результат. В данном примере – это или переменная a или переменная b. Тогда как обычный условный оператор предназначен для выполнения блока кода по определенному условию и сам по себе не возвращает никаких значений. То есть, если бы мы попытались записать что-то вроде:

d = if a > b:

то попросту возникла бы синтаксическая ошибка – так делать нельзя. А вот результат работы тернарного оператора мы, обычно, сохраняем в некой переменной.

Второе важное отличие – в тернарном операторе нет внутренних блоков, где бы мы могли записывать несколько операторов. Вместо a и b можно прописывать только одну какую-либо конструкцию. Часто это некое значение, или результат работы операторов, например, арифметических:

res = a + 2 if a > b else b - 5

Так делать вполне допустимо. Или же, можно использовать какие-либо функции:

a = -12
b = -7
res = abs(a) if a > b else abs(b)

То есть, здесь может быть любая конструкция языка Python, но только одна. По идее, можно даже записать функцию print():

res = print(a) if a > b else print(b)

Но тогда переменная res будет принимать значение None, так как функция print() ничего возвращает, то есть, None.

Давайте приведу еще один пример. Пусть имеется некая строка и способ преобразования этой строки:

s = 'python'
type = 'upper'

Пусть 'upper' означает преобразование строки s в верхний регистр. Сделаем это через тернарный оператор, следующим образом:

res = s.upper() if type == 'upper' else s

Видите, как элементарно и просто реализуется эта идея? В этом большой плюс тернарного оператора. Вообще, его можно рассматривать, как некий активный объект, который возвращает определенное значение в зависимости от условия. Благодаря этому, его можно вызывать прямо внутри различных конструкций, например:

[1, 2, a if a < b else b, 4, 5]
"a - " + ("четное" if a % 2 == 0 else "нечетное") + " число"

Обратите внимание здесь на круглые скобки. Они необходимы, чтобы следующий оператор + применялся к результирующей строке, а не к тернарному оператору. Если круглые скобки убрать, то последняя добавка пропадет.

Или его можно указать, как один из аргументов функции:

max(1, 5, a if a > 0 else b, 4, 5)

Я, надеюсь, из этих примеров вам стал понятен принцип использования тернарного условного оператора.

Вложенный тернарный оператор

Так как внутри тернарного оператора можно использовать любые конструкции, то кто нам мешает вложить один тернарный оператор в другой, например, так:

<r_1> if <c_1> else <r_2> if <c_2> else <r_3>

или так:

<r_1> if <c_1> else <r_2> if <c_2> else <r_3> if <c_3> else <r_4>

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

Приведу один пример с такими вложениями. На предыдущем занятии мы с вами записывали вложенные условия для определения максимального из трех чисел. Давайте сделаем то же самое, но через тернарные операторы. Программа будет такой:

a = 2
b = 3
c = -4
 
d = (a if a > c else c) if a > b else (b if b > c else c)
print(d)

Думаю, общий принцип здесь понятен. Сначала проверяем условие a > b, затем, в зависимости от результата проверки, выполняется или левый тернарный оператор, или правый. Причем, опят же здесь обязательно вложенные тернарные операторы следует взять в круглые скобки, чтобы тернарная конструкция if-else воспринималась как единое целое во вложениях.

Вам осталось закрепить этот материал практическими заданиями и, затем, переходите к следующему уроку.

Курс по Python: https://stepik.org/course/100707

Видео по теме