Ветвление в Python
Любая программа — это последовательность инструкций, но настоящая мощь кода раскрывается, когда он может принимать решения. Ветвление — это конструкция, позволяющая программе выполнять разные блоки кода в зависимости от условий. Без ветвления все программы работали бы как простой калькулятор: ввели данные, получили результат. Благодаря if, else и современному match case, Python может «думать» и выбирать нужную ветку алгоритма.В этой статье мы подробно разберем все способы организации ветвления в Python — от базовых конструкций до сложного структурного сопоставления с образцом.
1. Булевы значения и операторы сравнения
Любая проверка в Python строится на условии — выражении, которое может быть либо истинным (True), либо ложным (False).
Операторы сравнения
Чтобы сравнить значения, используются следующие операторы:
- == — равно
- != — не равно
- > — больше
- < — меньше
- >= — больше или равно
- <= — меньше или равно
Логические операторы
Для создания сложных условий используйте логические связки:
- and — И: истина, только если оба условия истинны.
- or — ИЛИ: истина, если хотя бы одно условие истинно.
- not — НЕ: инвертирует значение (меняет True на False и наоборот).
Важный нюанс про and и or: они вычисляются по короткой схеме. Python не проверяет всё выражение целиком, если ответ уже ясен. Например, в условии if x > 0 and (10 / x) > 1: если x окажется нулем, деление не произойдет, потому что левая часть (x > 0) будет False, и Python уже знает, что всё выражение ложно.
2. Классическое ветвление: if, elif, else
Это основа основ Python. Синтаксис максимально приближен к английскому языку, а блоки кода отделяются друг от друга отступами (обычно 4 пробела или табуляция). Ветвление (условные конструкции) позволяет программе выполнять разные блоки кода в зависимости от условий. В Python для этого используют:
- if — основной блок условия;
- elif (сокращение от else if) — дополнительные проверки;
- else — блок по умолчанию, если все условия не выполнены.
Синтаксис и правила
- после условия ставится двоеточие (:);
- тело блока выделяется отступами (обычно 4 пробела);
- условия проверяются последовательно сверху вниз;
- выполняется только первый блок с истинным условием.
Конструкция if (Одиночный выбор)
Выполняет блок кода, если условие истинно (True).
Синтаксис:if условие:
# код выполняется, если условие Trueage = 18
if age >= 18:
print("Вы совершеннолетний")
# Вывод: Вы совершеннолетний
temperature = 25
if temperature > 20:
print("На улице тепло, можно идти без куртки!")
# Вывод: На улице тепло, можно идти без куртки!x = 5
y = 10
# and
if x > 0 and y > 0:
print("Оба числа положительные")
# or
if x < 0 or y < 0:
print("Хотя бы одно число отрицательное")
# not
if not x == y:
print("Числа не равны")Конструкция if-else (Двойной выбор)
Выполняет один блок кода, если условие истинно, и другой — если ложно (False).
Синтаксис:if условие:
# выполняется, если True
else:
# выполняется, если Falseage = 16
if age >= 18:
print("Доступ разрешен")
else:
print("Доступ запрещен. Вам нет 18 лет.")
# Вывод: Доступ запрещен. Вам нет 18 лет.
temperature = 25
if temperature > 30:
print("Жарко!")
else:
print("Комфортная температура")
# Вывод: Комфортная температураКонструкция if-elif-else (Множественный выбор)
elif — это сокращение от else if. Позволяет проверять несколько условий последовательно. Как только Python находит первое истинное условие, он выполняет соответствующий блок и выходит из всей конструкции .
Синтаксис:if условие1:
# выполняется, если условие1 True
elif условие2:
# выполняется, если условие2 True и условие1 False
elif условие3:
# выполняется, если условие3 True и предыдущие False
else:
# выполняется, если все условия Falsescore = 85
if score >= 90:
grade = "Отлично (A)"
elif score >= 80:
grade = "Хорошо (B)"
elif score >= 70:
grade = "Удовлетворительно (C)"
else:
grade = "Неудовлетворительно (F)"
print(f"Ваша оценка: {grade}")
# Вывод: Хорошо (B)Совет: Порядок условий критичен. Если бы мы сначала проверили score >= 80, а потом score >= 90, то оценка 95 попала бы в блок B, потому что 95 >= 80 истинно, а последующие проверки уже не выполняются.
Вложенные условия
Можно размещать условные конструкции внутри других условных конструкций.
Пример:user_age = 20
has_license = True
if user_age >= 18:
if has_license:
print("Можно водить машину")
else:
print("Нужно получить права")
else:
print("Слишком молод для вождения")
# Вывод: Можно водить машину*Старайтесь избегать слишком глубокой вложенности (более 3-4 уровней). Это делает код «спагетти». Иногда лучше переписать логику, используя and или выделив часть кода в функцию.*
Условная ложь: что Python считает False?
В Python if можно использовать не только с явными True/False, но и с любыми объектами. Некоторые значения по умолчанию эквивалентны False:
- None
- Числовой ноль: 0, 0.0, 0j
- Пустые коллекции: "" (пустая строка), [] (пустой список), {} (пустой словарь), set() (пустое множество).
Все остальные значения считаются True.
Пример:name = ""
if name:
print(f"Привет, {name}")
else:
print("Вы не ввели имя!") # Сработает этот блок, так как строка пустаЭта фишка позволяет писать очень лаконичный и читаемый код.
3. Тернарный оператор
Для простых присваиваний, зависящих от условия, существует однострочная запись - компактная форма if-else. Синтаксис:
значение_если_истина if условие else значение_если_ложьage = 20
status = "Взрослый" if age >= 18 else "Ребенок"
print(status) # ВзрослыйЭто гораздо удобнее, чем расписывать полную конструкцию if-else на три строки ради одного присваивания.
4. Оператор match case
Оператор match (pattern matching, сопоставление с образцом) появился в Python 3.10 (октябрь 2021). Это не просто аналог switch/case из других языков, а мощный механизм структурного сопоставления, который позволяет:
- сравнивать значение с шаблонами;
- извлекать данные из составных типов;
- обрабатывать сложные структуры данных;
- комбинировать проверку типа, распаковку и условия.
match выражение:
case шаблон_1:
# действия для шаблона 1
case шаблон_2:
# действия для шаблона 2
...
case _:
# блок по умолчанию (аналог else)Простая замена if-elif
def get_http_status(code):
match code:
case 200:
return "OK"
case 404:
return "Not Found"
case 500:
return "Internal Server Error"
case _: # Аналог else — подстановочный знак
return "Unknown code"
print(get_http_status(404)) # Not FoundОбъединение вариантов (|)
def print_hello(language):
match language:
case "russian":
print("Привет")
case "american english" | "british english" | "english":
print("Hello")
case _:
print("Undefined")
print_hello("american english") # HelloРабота с кортежами (распаковка и сопоставление)
def process_coordinates(point):
match point:
case (0, 0):
print("Точка в начале координат")
case (x, 0):
print(f"Точка на оси X: {x}")
case (0, y):
print(f"Точка на оси Y: {y}")
case (x, y):
print(f"Точка в ({x}, {y})")
case _:
print("Не координаты")
process_coordinates((5, 0)) # Точка на оси X: 5
process_coordinates((3, 4)) # Точка в (3, 4)
process_coordinates([1, 2]) # Списки тоже работают: Точка в (1, 2)Работа со списками разной длины
def process_items(items):
match items:
case []:
print("Пустой список")
case [first]:
print(f"Один элемент: {first}")
case [first, second]:
print(f"Два элемента: {first} и {second}")
case [first, *rest]:
print(f"Первый: {first}, остальные: {rest}")
process_items([1, 2, 3, 4]) # Первый: 1, остальные: [2, 3, 4]Охранные выражения (if в case)
match value:
case int(x) if x > 0:
print(f"Положительное целое число: {x}")
case int(x):
print(f"Отрицательное или ноль: {x}")def check_point(point):
match point:
case (x, y) if x == y:
print(f"Точка на диагонали: ({x}, {y})")
case (x, y) if x > 0 and y > 0:
print(f"Точка в первом квадранте: ({x}, {y})")
case _:
print("Другая точка")
check_point((5, 5)) # Точка на диагонали: (5, 5)
check_point((3, 4)) # Точка в первом квадранте: (3, 4)Сопоставление по типу
def process_value(value):
match value:
case int():
print(f"Целое число: {value}")
case float():
print(f"Дробное число: {value}")
case str() as text if len(text) > 10:
print(f"Длинная строка: {text[:10]}...")
case str() as text:
print(f"Строка: {text}")
case list() | tuple() as sequence:
print(f"Последовательность длиной {len(sequence)}")
case _:
print("Что-то другое")
process_value("Hello world!") # Длинная строка: Hello worl...
process_value([1, 2, 3]) # Последовательность длиной 3Работа с классами и dataclass
from dataclasses import dataclass
from typing import Literal
@dataclass
class User:
name: str
role: Literal["admin", "editor", "viewer"]
active: bool
def handle_user(user: User):
match user:
case User(name="admin", role="admin"):
print("Супер-администратор")
case User(name=name, role="admin"):
print(f"Администратор {name}")
case User(role="editor", active=True):
print("Активный редактор")
case User(role="viewer", active=False):
print("Неактивный зритель")
case User(name=name, active=True):
print(f"Активный пользователь: {name}")
case _:
print("Неизвестный пользователь")
admin = User("alice", "admin", True)
editor = User("bob", "editor", True)
handle_user(admin) # Администратор alice
handle_user(editor) # Активный пользователь: bobОбработка JSON‑ответов API
def handle_api_response(response):
match response:
case {"status": "success", "data": list(data)}:
print(f"Успех! Получено {len(data)} элементов")
return process_data(data)
case {"status": "error", "code": 404, "message": msg}:
print(f"Не найдено: {msg}")
return None
case {"status": "error", "code": int(code), "message": msg}:
print(f"Ошибка {code}: {msg}")
return None5. Сравнение match case с if-elif-elseр
Когда использовать match:
- обработка сложных структур данных (кортежи, списки, словари);
- распаковка и извлечение данных из структур;
- обработка команд (например, в CLI‑приложениях);
- работа с JSON/API‑ответами;
- сопоставление по типам и структурам.
Когда лучше if-elif-else:
- простые проверки одного значения;
- проверки только по типу (isinstance);
- в критичных по производительности участках кода (хотя разница обычно незначительна).