Пример 1. Базовый if
Простейшая форма ветвления: код внутри блока выполняется, только если условие истинно, иначе просто пропускается.
temperature = 38.2
if temperature > 37:
print("Повышенная температура")
Что происходит: условие temperature > 37 истинно, поэтому строка печатается. Если бы температура была, например, 36.6, программа не вывела бы ничего — блок if без else при ложном условии просто пропускается.
Пример 2. if-elif-else: знак числа
Классическая задача из исходной практики: определить, является ли введённое число положительным, отрицательным или нулём.
number = -7 # результат int(input("Введите число: "))
if number > 0:
print("Число положительное.")
elif number < 0:
print("Число отрицательное.")
else:
print("Число равно нулю.")
# Число отрицательное.
Что происходит: проверяется первое условие. Если оно истинно, печатается сообщение и остальные проверки пропускаются. Если ложно — проверяется elif, и так далее; в цепочке if-elif-else срабатывает только одна ветка.
Пример 3. Несколько независимых if — не elif
В отличие от if-elif-else, отдельные if друг от друга не зависят: каждый делает собственную проверку, поэтому сработать может и один, и все сразу.
x = 20
if x > 15:
print("x больше 15")
if x > 5:
print("x больше 5")
if x == 0:
print("x равен 0")
else:
print("x не равен 0")
# x больше 15
# x больше 5
# x не равен 0
Почему так: здесь напечатались сразу три строки — каждый if проверяется независимо от результата предыдущего. Если бы это была цепочка elif, сработала бы только первая истинная ветка.
Пример 4. Truthy/falsy: приведение к bool
Любое значение в условии if Python сначала приводит к bool по своим правилам — как будто вызвал bool(значение).
values = [0, 1, "", "текст", [], [1, 2], None, {}, {"a": 1}]
for value in values:
if value:
print(f"{value!r:>10} -> True")
else:
print(f"{value!r:>10} -> False")
Что происходит: ложными (falsy) считаются 0, 0.0, пустая строка, пустые коллекции ([], {}, (), set()) и None. Всё остальное — истинно (truthy). Отсюда идиома if my_list: вместо if len(my_list) > 0:.
Пример 5. Вложенные if vs логические операторы
Вложенность и оператор and часто взаимозаменяемы: второй вариант короче и читается как единое условие.
age = 25
if age >= 18:
if age <= 60:
print("Рабочий возраст (вложенный if)")
if 18 <= age <= 60:
print("Рабочий возраст (цепочка сравнений)")
Что происходит: оба варианта дают одинаковый результат для age = 25. Цепочка сравнений 18 <= age <= 60 — это то же самое, что 18 <= age and age <= 60, но короче и без риска забыть закрыть вложенный блок.
Пример 6. and / or / not: приоритет операторов
Логические операторы можно комбинировать в одном выражении. Важно помнить порядок вычисления: сначала not, затем and, затем or.
a, b, c = True, False, True
print(a and b or c) # (a and b) or c -> True
print(a or b and c) # a or (b and c) -> True
print(not a and b) # (not a) and b -> False
print(not (a and b)) # not (a and b) -> True
not выше and, and выше or) в лекции отдельно не разбирался — при сомнении расставляйте скобки явно.
Пример 7. Тернарный оператор
Способ записать простое условие в одну строку. Подходит только для коротких выражений — вложенный вариант уже плохо читается.
x = 10
result = "Положительное" if x > 0 else "Отрицательное"
print(result)
x = 0
result = "Положительное" if x > 0 else "Отрицательное" if x < 0 else "Ноль"
print(result)
# Положительное
# Ноль
Почему так: вложенный тернарный оператор технически работает («разбирается» так же, как if-elif-else), но в реальном коде такой длины лучше писать обычный блочный оператор — он читается слева направо, а не «змейкой».
Пример 8. match-case: базовый синтаксис, | и _
Появился в Python 3.10 как более мощная альтернатива switch-case из других языков. | объединяет несколько значений в одном case, _ — universal-паттерн вроде else.
x = 5
match x:
case 1 | 2 | 3:
print("Малое число")
case 4 | 5 | 6:
print("Среднее число")
case _:
print("Другое число")
# Среднее число
Пример 9. match-case: guard-условие и проверка типа
case значение if условие: позволяет добавить к паттерну проверку — паттерн сам по себе не может содержать сравнения вроде >, поэтому значение сначала «захватывают» в переменную.
number = 7
match number:
case 1 | 2 | 3:
print("Это один, два или три")
case n if n > 5:
print("Число больше 5")
case _:
print("Число меньше или равно 5")
value = "Hello"
match value:
case int():
print("Это целое число.")
case str():
print("Это строка.")
case bool():
print("Это логический тип.")
case _:
print("Неизвестный тип данных.")
Пример 10. match-case: паттерн-матчинг кортежей
Ещё одна возможность match-case, недоступная обычному if: сопоставление со структурой данных, а не только со значением. Переменные x и y в паттерне создаются автоматически.
point = (0, 5)
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}")
# На оси Y в точке 5
Пример 11. Практика: доступ к разделу и стоимость билета
Два сценария из практики: вложенная проверка роли и доступа, и расчёт цены билета — независимые блоки if-elif для типа билета и для скидки.
role = "admin"
section_access = True
if role == "admin":
print("Вы администратор.")
if section_access:
print("У вас есть доступ к разделу.")
else:
print("У вас нет доступа к разделу.")
else:
print("Вы не администратор.")
ticket_type = "стандартный" # результат input("Введите тип билета (стандартный/vip): ")
age = 65 # результат int(input("Введите возраст: "))
if ticket_type == "vip":
price = 3000
else:
price = 1000
if age < 12:
price *= 0.50
elif age > 60 and ticket_type == "стандартный":
price *= 0.70
print("Стоимость билета:", price)
# Стоимость билета: 700.0
Что происходит: сначала определяется базовая цена по типу билета. Затем независимый блок if-elif применяет скидки: детям до 12 лет — 50% на любой билет, пенсионерам старше 60 — 30%, но только на стандартный билет.
Пример 12. Ловушка: спутать независимые if с elif
Частая ошибка новичков — написать несколько if там, где по смыслу нужен elif (или наоборот). Итог выглядит правильно на одних входных данных и ломается на других.
score = 75
if score >= 60:
print("Зачёт")
if score >= 90:
print("Отлично")
# напечаталось только "Зачёт" — это два независимых if,
# второе условие score >= 90 просто оказалось ложным для 75
Почему так: для score = 75 результат совпал бы и при elif, и при независимых if. Но при score = 95 независимые if напечатали бы «Зачёт» И «Отлично» одновременно — если по смыслу нужна только одна оценка, это баг. Подробнее о сравнениях см. урок 06.
Как запустить в VS Code
- Создайте файл
sign.py(или любой другой из примеров) в рабочей папке урока. - Скопируйте код из примера.
- Откройте терминал в VS Code (Ctrl + `).
- Убедитесь, что активировано виртуальное окружение:
venv\Scripts\activate(Windows) илиsource venv/bin/activate(Mac/Linux). - Запустите:
python sign.py