Перейти к содержимому

5. Условия и ветвления

Иллюстрация к уроку

age = 25
if age < 18:
print("Несовершеннолетний")
elif age < 65:
print("Взрослый")
else:
print("Пенсионер")

В отличие от JS: нет else if — только elif.

# Python # JavaScript
if x > 0: # if (x > 0) {
print("pos") # console.log("pos")
elif x < 0: # } else if (x < 0) {
print("neg") # console.log("neg")
else: # } else {
print("zero") # console.log("zero")
# }
# Python: значение_если_true if условие else значение_если_false
age = 20
status = "adult" if age >= 18 else "minor"
# Сравни с JS: условие ? значение_если_true : значение_если_false
# const status = age >= 18 ? "adult" : "minor";
# and, or, not (не &&, ||, !)
x = 5
if x > 0 and x < 10:
print("однозначное число")
if x < 0 or x > 100:
print("выход за диапазон")
if not (x == 0):
print("не ноль")
# Chained comparisons (Python фишка!)
if 0 < x < 10: # Эквивалентно: x > 0 and x < 10
print("от 0 до 10")
if 1 <= age <= 120:
print("корректный возраст")
# Falsy значения (все остальное — truthy)
falsy_values = [False, None, 0, 0.0, "", [], {}, set()]
for val in falsy_values:
if not val:
print(f"{repr(val)} is falsy")
# Практически используем так:
user = None
if user: # вместо: if user is not None
print(f"Hello, {user}")
items = []
if not items: # вместо: if len(items) == 0
print("Список пуст")
name = ""
display_name = name or "Аноним" # "Аноним" если name пустая
# == проверяет значение
# is проверяет идентичность объекта (та же ячейка памяти)
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True — одинаковые значения
print(a is b) # False — разные объекты
# is используется с None, True, False
user = None
if user is None: # правильно!
print("нет пользователя")
if user == None: # работает, но не pythonic
print("нет пользователя")

Pattern matching — как switch/case, но намного мощнее:

# Простой match
command = "start"
match command:
case "start":
print("Запуск...")
case "stop":
print("Остановка...")
case "restart":
print("Перезапуск...")
case _: # default
print(f"Неизвестная команда: {command}")
# Match с условиями (guard)
status_code = 404
match status_code:
case 200 | 201 | 204:
print("Успех")
case 400:
print("Bad Request")
case 401 | 403:
print("Нет доступа")
case 404:
print("Не найдено")
case code if 500 <= code < 600:
print(f"Серверная ошибка: {code}")
case _:
print("Неизвестный статус")
# Match со структурами (очень мощно!)
user = {"role": "admin", "active": True}
match user:
case {"role": "admin", "active": True}:
print("Активный администратор")
case {"role": "admin"}:
print("Неактивный администратор")
case {"role": role}:
print(f"Пользователь с ролью: {role}")
# Валидация данных
def validate_age(age):
if not isinstance(age, int):
return "Возраст должен быть целым числом"
if age < 0:
return "Возраст не может быть отрицательным"
if age > 150:
return "Недопустимый возраст"
return None # OK
# Обработка HTTP статусов
def handle_response(status: int, data: dict | None = None):
match status:
case 200 | 201:
return {"success": True, "data": data}
case 400:
return {"success": False, "error": "Некорректный запрос"}
case 401:
return {"success": False, "error": "Не авторизован"}
case 403:
return {"success": False, "error": "Нет доступа"}
case 404:
return {"success": False, "error": "Не найдено"}
case _:
return {"success": False, "error": "Неизвестная ошибка"}
# Проверка прав доступа
def check_permission(user: dict, action: str) -> bool:
if not user.get("is_active"):
return False
role = user.get("role", "guest")
if role == "admin":
return True # admin может всё
if role == "editor":
return action in ["read", "write"]
return action == "read" # guest только читает
# Задание 1: Калькулятор
# Напиши функцию, принимающую два числа и операцию (+, -, *, /)
# и возвращающую результат. Используй match/case.
# Задание 2: Классификатор
# Напиши функцию classify_bmi(weight_kg, height_m) -> str
# Категории: Underweight < 18.5, Normal 18.5-25, Overweight 25-30, Obese > 30
# Задание 3: Авторизация
# Напиши функцию can_access(user, resource) -> bool
# user = {"role": "editor", "is_active": True, "department": "tech"}
# Логика: admin — всё, editor — только свой отдел, user — только чтение

В следующем уроке — циклы!