Python & AI Tutorials Logo
Программирование Python

10. Использование условных выражений (if-else expressions)

В главе 8 мы научились принимать решения в наших программах с помощью операторов if. Эти операторы позволяют выполнять разные блоки кода в зависимости от условий. Однако иногда нам нужно выбрать между двумя значениями, а не между двумя блоками кода. Python предоставляет специальный синтаксис для этой распространённой ситуации: условные выражения (conditional expressions).

Условные выражения (conditional expressions) (которые в других языках также называют тернарными выражениями (ternary expressions) или тернарным оператором (ternary operator)) позволяют писать компактный код принятия решений, когда нам просто нужно выбрать одно значение или другое на основе условия. Они особенно полезны при присваиваниях и при построении более крупных выражений.

10.1) Что такое условные выражения

Условное выражение (conditional expression) — это одно выражение, которое вычисляется в одно из двух значений на основе условия. В отличие от оператора if, который управляет тем, какой блок кода выполняется, условное выражение выдаёт значение, которое можно использовать сразу.

Рассмотрим распространённый сценарий. Предположим, мы пишем программу, чтобы классифицировать учеников по возрасту:

python
# Использование оператора if (то, что мы уже знаем)
age = 16
if age >= 18:
    category = "adult"
else:
    category = "minor"
print(f"Category: {category}")  # Output: Category: minor

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

python
# Использование условного выражения
age = 16
category = "adult" if age >= 18 else "minor"
print(f"Category: {category}")  # Output: Category: minor

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

Понимание фундаментального отличия

Ключевое различие в том, что условные выражения — это выражения, а не операторы:

  • Выражение (expression) — это то, что вычисляется в значение. Его можно использовать везде, где ожидается значение: в присваиваниях, как аргументы функций, внутри других выражений и т. д.
  • Оператор (statement) — это законченная инструкция, которая выполняет действие, но не производит значение.
python
# Это выражение — оно производит значение
result = 10 if True else 20
 
# Это оператор — он выполняет действия, но сам по себе не является значением
if True:
    result = 10
else:
    result = 20

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

10.2) Синтаксис выражения if–else

Синтаксис условного выражения следует такой схеме:

value_if_true if condition else value_if_false

Разберём каждый компонент:

  1. value_if_true: выражение, которое вычисляется и возвращается, если условие равно True
  2. if: ключевое слово, вводящее условие
  3. condition: булево выражение, которое определяет, какое значение возвращается
  4. else: ключевое слово, вводящее альтернативное значение
  5. value_if_false: выражение, которое вычисляется и возвращается, если условие равно False

Обратите внимание: порядок может показаться необычным, если вы знакомы с другими языками программирования. В Python «истинное» значение идёт первым, затем условие, затем «ложное» значение. Такой порядок читается почти как естественный английский: «Дай мне X, если условие истинно, иначе дай мне Y».

Да

Нет

Начало: вычислить условие

Условие истинно?

Вычислить и вернуть
value_if_true

Вычислить и вернуть
value_if_false

Результат доступен

Рассмотрим несколько примеров с разными типами значений:

python
# Пример 1: выбор между числами
temperature = 25
comfort_level = "warm" if temperature > 20 else "cool"
print(comfort_level)  # Output: warm
 
# Пример 2: выбор между вычислениями
score = 85
bonus = 10 if score >= 90 else 5
print(f"Bonus points: {bonus}")  # Output: Bonus points: 5
 
# Пример 3: выбор между булевыми значениями
has_permission = True
access = "granted" if has_permission else "denied"
print(f"Access: {access}")  # Output: Access: granted
 
# Пример 4: условием может быть любое булево выражение
username = "admin"
role = "administrator" if username == "admin" else "regular user"
print(f"Role: {role}")  # Output: Role: administrator

Важные замечания по синтаксису

Часть else в условном выражении обязательна. В отличие от оператора if, где else необязателен, здесь вы должны указать обе альтернативы:

python
# Это НЕВЕРНО — отсутствует else
# result = "yes" if True  # SyntaxError
 
# Это ВЕРНО — обе ветки указаны
result = "yes" if True else "no"

Это требование имеет смысл, потому что выражение всегда должно производить значение. Если условие равно False и части else нет, какое значение должно выдать выражение? Python требует, чтобы вы явно указали обе возможности.

10.3) Как вычисляются условные выражения

Понимание того, как Python вычисляет условные выражения, помогает писать корректный код и предсказывать, что будут делать ваши программы. Вычисление следует определённой, предсказуемой последовательности.

Процесс вычисления

Python вычисляет условное выражение в таком порядке:

  1. Вычислить условие (булево выражение после if)
  2. В зависимости от результата:
    • Если условие равно True, вычислить и вернуть value_if_true
    • Если условие равно False, вычислить и вернуть value_if_false

Критически важно, что Python вычисляет только одну из двух веток значений, а не обе. Это называется вычислением с коротким замыканием (short-circuit evaluation) и похоже на то, как работают операторы and и or (которые мы изучали в главе 9).

python
# Вычисляется только нужная ветка
x = 10
result = x * 2 if x > 5 else x / 2
# Поскольку x > 5 равно True, Python вычисляет x * 2 (получая 20)
# и никогда не вычисляет x / 2
print(result)  # Output: 20

Почему вычисление с коротким замыканием важно

Вычисление с коротким замыканием может предотвращать ошибки и повышать эффективность:

python
# Пример 1: предотвращение деления на ноль
denominator = 0
result = "undefined" if denominator == 0 else 100 / denominator
print(result)  # Output: undefined
# Деление 100 / denominator никогда не выполняется, потому что
# условие равно True, поэтому мы избегаем ZeroDivisionError
python
# Пример 2: предотвращение операций с None
data = None
length = 0 if data is None else len(data)
print(length)  # Output: 0
# len(data) никогда не вызывается, потому что data равно None,
# что предотвращает TypeError

«Истинность» (truthiness) в условных выражениях

Как и в операторах if (глава 8), условие в условном выражении использует правила «истинности» Python. Любое значение может использоваться как условие:

python
# Пустая строка — falsy
name = ""
greeting = f"Hello, {name}" if name else "Hello, guest"
print(greeting)  # Output: Hello, guest
 
# Непустая строка — truthy
name = "Alice"
greeting = f"Hello, {name}" if name else "Hello, guest"
print(greeting)  # Output: Hello, Alice
 
# Ноль — falsy, ненулевое значение — truthy
items = 0
message = "You have items" if items else "Your cart is empty"
print(message)  # Output: Your cart is empty
 
items = 3
message = "You have items" if items else "Your cart is empty"
print(message)  # Output: You have items

Вложенное вычисление

Значения в условном выражении сами могут быть выражениями, включая другие условные выражения. Python вычисляет их изнутри наружу:

python
# value_if_true само по себе является вычислением
age = 25
price = age * 2 if age < 18 else age * 3
print(price)  # Output: 75
# Шаги: age < 18 → False → вычислить age * 3 → 75
 
# Условие является сложным выражением
score = 85
grade = 90
status = "excellent" if score >= 80 and grade >= 85 else "good"
print(status)  # Output: excellent
# Шаги: score >= 80 → True, grade >= 85 → True
#        True and True → True → вернуть "excellent"

10.4) Использование условных выражений в присваиваниях

Одно из самых распространённых применений условных выражений — в присваиваниях, когда мы хотим установить переменной одно из двух значений на основе условия. Этот паттерн часто встречается в реальном коде.

Простые шаблоны присваивания

Рассмотрим практические примеры, где условные выражения делают присваивания аккуратнее:

python
# Пример 1: установка скидки в зависимости от членства
is_member = True
discount = 0.15 if is_member else 0.05
print(f"Discount: {discount * 100}%")  # Output: Discount: 15.0%
 
# Пример 2: определение стоимости доставки
order_total = 45.00
shipping = 0 if order_total >= 50 else 5.99
print(f"Shipping: ${shipping:.2f}")  # Output: Shipping: $5.99
 
# Пример 3: установка значения по умолчанию
user_input = ""  # Имитируем пустой ввод
page_size = int(user_input) if user_input else 10
print(f"Items per page: {page_size}")  # Output: Items per page: 10

Сравнение с операторами if

Посмотрим на те же присваивания, записанные с помощью операторов if, чтобы оценить разницу:

python
# Использование оператора if (более многословно)
is_member = True
if is_member:
    discount = 0.15
else:
    discount = 0.05
 
# Использование условного выражения (более компактно)
is_member = True
discount = 0.15 if is_member else 0.05

Оба подхода работают правильно, но условное выражение короче, когда вы просто выбираете между двумя значениями. Вариант с оператором if требует четырёх строк и повторяет имя переменной discount дважды, тогда как условное выражение делает то же самое в одной строке.

Несколько присваиваний с согласованной логикой

Когда вам нужно сделать несколько присваиваний на основе одного и того же условия, у вас есть варианты:

python
# Подход 1: несколько условных выражений
is_premium = True
price = 99.99 if is_premium else 149.99
features = "all" if is_premium else "basic"
support = "priority" if is_premium else "standard"
 
# Подход 2: один оператор if для нескольких присваиваний
is_premium = True
if is_premium:
    price = 99.99
    features = "all"
    support = "priority"
else:
    price = 149.99
    features = "basic"
    support = "standard"

В этом случае подход с оператором if (Подход 2) часто более читаем, потому что он группирует связанные присваивания и явно показывает связь между ними. Подход с условными выражениями (Подход 1) работает, но повторяет условие три раза, и это может быть сложнее поддерживать, если условие нужно изменить.

10.5) Использование условных выражений внутри более крупных выражений

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

Условные выражения в арифметике

Вы можете использовать условные выражения как операнды в арифметических операциях:

python
# Условное сложение
base_score = 80
bonus_eligible = True
final_score = base_score + (10 if bonus_eligible else 0)
print(f"Final score: {final_score}")  # Output: Final score: 90

Условные выражения в форматировании строк

Условные выражения отлично работают с f-строками и другими строковыми операциями:

python
# Пример 1: множественное число в сообщениях
item_count = 1
message = f"You have {item_count} {'item' if item_count == 1 else 'items'}"
print(message)  # Output: You have 1 item
 
item_count = 3
message = f"You have {item_count} {'item' if item_count == 1 else 'items'}"
print(message)  # Output: You have 3 items
 
# Пример 2: условное приветствие в зависимости от времени
hour = 14
greeting = f"Good {'morning' if hour < 12 else 'afternoon'}, user!"
print(greeting)  # Output: Good afternoon, user!

Вложенные условные выражения

Вы можете вкладывать условные выражения, чтобы обрабатывать несколько условий, хотя делать это следует умеренно:

python
# Пример 1: классификация по трём вариантам
score = 85
grade = "A" if score >= 90 else ("B" if score >= 80 else "C")
print(f"Grade: {grade}")  # Output: Grade: B
 
# Давайте проследим это:
# score >= 90? Нет (85 < 90)
# Значит вычисляем часть else: ("B" if score >= 80 else "C")
# score >= 80? Да (85 >= 80)
# Возвращаем "B"
 
# Пример 2: классификация температуры
temp = 15
category = "hot" if temp > 25 else ("warm" if temp > 15 else "cold")
print(f"Category: {category}")  # Output: Category: cold
 
# Пример 3: цена по возрасту с несколькими уровнями
age = 65
price = 0 if age < 5 else (8 if age < 18 else (12 if age < 65 else 8))
print(f"Ticket price: ${price}")  # Output: Ticket price: $8

Важное замечание о вложенности: Хотя вложенные условные выражения возможны, они быстро становятся трудночитаемыми. Третий пример выше технически корректен, но его сложно понять. Мы обсудим лучшие альтернативы в разделе 10.7.

Условные выражения в сравнениях

Вы можете использовать условные выражения внутри операций сравнения:

python
# Пример 1: сравнение с условным значением
base_value = 10
threshold = 15
is_large = True
result = base_value > (threshold if is_large else 5)
print(result)  # Output: False
# Вычисляется: base_value > 15 → 10 > 15 → False
 
# Пример 2: условная проверка равенства
user_role = "admin"
required_role = "admin" if True else "user"
has_access = user_role == required_role
print(has_access)  # Output: True

10.6) Условное выражение vs оператор if (выражение vs оператор)

Понимание того, когда использовать условное выражение, а когда оператор if, критически важно для написания понятного и поддерживаемого кода. Различие сводится к фундаментальной разнице между выражениями и операторами в Python.

Выражения vs операторы: ключевое различие

Давайте уточним эти термины точно:

  • Выражение (expression) — это комбинация значений, переменных, операторов и вызовов функций, которую Python вычисляет, чтобы получить значение. Примеры: 2 + 3, "hello".upper(), x if x > 0 else 0

  • Оператор (statement) — это законченная инструкция, которая выполняет действие. Операторы не производят значения — они делают что-то. Примеры: if x > 0: print("positive"), x = 5, for i in range(10): print(i)

python
# Это выражение — оно производит значение (7)
result = 3 + 4
 
# Это оператор — он выполняет действие (печатает)
print("Hello")
 
# Условное выражение — это выражение
value = "yes" if True else "no"  # Produces "yes"
 
# Оператор if — это оператор
if True:
    value = "yes"
else:
    value = "no"
# Выполняет присваивание, но сам if не производит значение

Когда использовать условные выражения

Условные выражения идеальны, когда:

1. Вы выбираете между двумя значениями для присваивания:

python
# Хорошее применение условного выражения
age = 16
status = "adult" if age >= 18 else "minor"
 
# Менее лаконично с оператором if
age = 16
if age >= 18:
    status = "adult"
else:
    status = "minor"

2. Вам нужно значение «встроенно» внутри более крупного выражения:

python
# Хорошее применение — значение нужно внутри f-string
items = 1
print(f"You have {items} {'item' if items == 1 else 'items'}")
# Output: You have 1 item
 
# Неуклюже с оператором if — требуется предварительное присваивание
items = 1
if items == 1:
    word = "item"
else:
    word = "items"
print(f"You have {items} {word}")

3. Логика проста, и выражение остаётся читаемым:

python
# Хорошее применение — простая, ясная логика
discount = 0.15 if is_member else 0.05
max_value = a if a > b else b
sign = "positive" if x > 0 else "non-positive"

Когда использовать операторы if

Используйте операторы if, когда:

1. Нужно выполнить несколько операторов в каждой ветке:

python
# Используйте оператор if — несколько действий на ветку
if score >= 90:
    grade = "A"
    message = "Excellent work!"
    bonus_points = 10
else:
    grade = "B"
    message = "Good job!"
    bonus_points = 5
 
# Условные выражения здесь были бы неуклюжи:
# grade = "A" if score >= 90 else "B"
# message = "Excellent work!" if score >= 90 else "Good job!"
# bonus_points = 10 if score >= 90 else 5
# (Лишний раз повторяет условие)

2. У вас больше двух веток (elif):

python
# Используйте оператор if — несколько веток
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "F"
 
# Вложенные условные выражения становятся трудночитаемыми:
# grade = "A" if score >= 90 else ("B" if score >= 80 else ("C" if score >= 70 else "F"))

3. Одна из веток должна ничего не делать:

python
# Используйте оператор if — ветка else ничего не делает
if error_occurred:
    print("An error occurred")
    log_error(error_message)
# else не нужен
 
# Условное выражение требует обеих веток:
# result = handle_error() if error_occurred else None  # Awkward

Сравнение бок о бок

Посмотрим на одну и ту же логику, реализованную двумя способами:

python
# Сценарий: установка стоимости доставки
 
# Версия 1: условное выражение (хорошо для простого выбора значения)
order_total = 45.00
shipping = 0 if order_total >= 50 else 5.99
 
# Версия 2: оператор if (более многословно, но для некоторых понятнее)
order_total = 45.00
if order_total >= 50:
    shipping = 0
else:
    shipping = 5.99
 
# Обе версии дают одинаковый результат
print(f"Shipping: ${shipping:.2f}")  # Output: Shipping: $5.99

Для этого простого случая условное выражение более лаконично и столь же понятно. Но рассмотрим более сложный сценарий:

python
# Сценарий: обработка заказа с несколькими шагами
 
# Версия 1: оператор if (подходит для нескольких действий)
order_total = 45.00
if order_total >= 50:
    shipping = 0
    discount = 0.10
    message = "Free shipping applied!"
else:
    shipping = 5.99
    discount = 0
    message = "Add $5 more for free shipping"
 
# Версия 2: условные выражения (неуклюже и повторяется)
order_total = 45.00
shipping = 0 if order_total >= 50 else 5.99
discount = 0.10 if order_total >= 50 else 0
message = "Free shipping applied!" if order_total >= 50 else "Add $5 more for free shipping"

Здесь версия с оператором if яснее, потому что она группирует связанную логику и не повторяет условие.

10.7) Когда условные выражения улучшают читаемость (а когда — нет)

Условные выражения — мощный инструмент, но, как и любой инструмент, их можно использовать неправильно. Цель всегда — писать код, который не просто корректен, но и понятен и удобен в сопровождении. Давайте рассмотрим рекомендации по эффективному использованию условных выражений.

Когда условные выражения улучшают читаемость

1. Простые, ясные варианты выбора между двумя значениями

Условные выражения превосходны, когда логика прямолинейна:

python
# Отличное применение — предельно ясно
discount = 0.20 if is_member else 0.10
 
# Отличное применение — смысл очевиден
status = "active" if user_logged_in else "inactive"
 
# Отличное применение — простой булев выбор
can_vote = True if age >= 18 else False
# Хотя это можно сделать ещё проще: can_vote = age >= 18

2. Выбор значения «встроенно» в выражениях

Когда вам нужно значение внутри выражения, и «вынести» его было бы неуклюже:

python
# Отличное применение — естественное множественное число
print(f"Found {count} {'result' if count == 1 else 'results'}")
 
# Отличное применение — встроенная корректировка вычисления
total = base_price * (0.9 if is_sale else 1.0)
 
# Отличное применение — условное форматирование
output = f"Status: {status.upper() if is_error else status.lower()}"

3. Установка значений по умолчанию

Условные выражения хорошо подходят для задания запасных значений:

python
# Отличное применение — паттерн значения по умолчанию
display_name = username if username else "Guest"
 
# Отличное применение — конфигурация со значениями по умолчанию
page_size = user_preference if user_preference else 25
 
# Отличное применение — безопасное деление
result = total / count if count > 0 else 0

Когда условные выражения ухудшают читаемость

1. Вложенные условные выражения

Вложенность условных выражений создаёт трудночитаемый код:

python
# Плохая читаемость — вложенные условные выражения
grade = "A" if score >= 90 else ("B" if score >= 80 else ("C" if score >= 70 else "F"))
 
# Гораздо лучше — использовать оператор if-elif-else
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "F"

Версия if-elif-else сразу понятна. Вложенное условное выражение требует внимательного разбора, чтобы понять логику.

2. Сложные условия

Когда само условие сложное, условные выражения становятся трудночитаемыми:

python
# Плохая читаемость — сложное условие
result = "eligible" if age >= 18 and income > 30000 and credit_score > 650 and not has_bankruptcy else "not eligible"
 
# Лучше — использовать оператор if с понятной структурой
if age >= 18 and income > 30000 and credit_score > 650 and not has_bankruptcy:
    result = "eligible"
else:
    result = "not eligible"
 
# Ещё лучше — разбить условие
meets_age_requirement = age >= 18
meets_income_requirement = income > 30000
meets_credit_requirement = credit_score > 650
has_clean_record = not has_bankruptcy
 
if meets_age_requirement and meets_income_requirement and meets_credit_requirement and has_clean_record:
    result = "eligible"
else:
    result = "not eligible"

3. Несколько условных выражений в одной строке

Комбинирование нескольких условных выражений в одной строке:

python
# Плохая читаемость — слишком много в одной строке
price = base * (0.9 if is_member else 1.0) * (0.85 if is_sale else 1.0) + (0 if free_shipping else 5.99)
 
# Лучше — разбить на шаги
member_multiplier = 0.9 if is_member else 1.0
sale_multiplier = 0.85 if is_sale else 1.0
shipping_cost = 0 if free_shipping else 5.99
price = base * member_multiplier * sale_multiplier + shipping_cost
 
# Или использовать оператор if, если логика сложная
if is_member:
    price = base * 0.9
else:
    price = base
 
if is_sale:
    price = price * 0.85
 
if free_shipping:
    shipping_cost = 0
else:
    shipping_cost = 5.99
 
price = price + shipping_cost

Итог

Используйте условные выражения, когда они делают ваш код понятнее и короче. Используйте операторы if, когда вам нужно:

  • Несколько операторов на ветку
  • Больше двух веток (elif)
  • Сложные условия или логика
  • Побочные эффекты или действия вместо выбора значения

Если сомневаетесь, выбирайте ясность вместо «хитрости». Код читают гораздо чаще, чем пишут, поэтому оптимизируйте для читателя.


Условные выражения — ценное дополнение к вашему набору инструментов Python. Они позволяют писать лаконичный, элегантный код, когда нужно выбрать между двумя значениями. Понимая, когда они улучшают читаемость, а когда — нет, вы сможете осознанно решать, когда их использовать.

Ключевые принципы, которые стоит запомнить:

  1. Условные выражения производят значения и могут использоваться везде, где нужно значение
  2. Синтаксис: value_if_true if condition else value_if_false
  3. Python вычисляет только релевантную ветку (вычисление с коротким замыканием)
  4. Они идеальны для простого выбора значения в присваиваниях и выражениях
  5. Используйте операторы if для нескольких действий, сложной логики или более чем двух веток
  6. Ставьте читаемость на первое место — если условное выражение трудно понять, используйте вместо него оператор if

По мере того как вы продолжите изучать Python, у вас появится интуиция, когда условные выражения улучшают ваш код. Сначала практикуйтесь на простых случаях, и постепенно вы начнёте узнавать паттерны, в которых они особенно хороши. В следующей главе мы рассмотрим циклы while, которые позволяют повторять действия на основе условий — развивая навыки принятия решений, которые мы сформировали в этой части книги.

© 2025. Primesoft Co., Ltd.
support@primesoft.ai