Python с нуля · Глава 4 из 10

Глава 4. Управляющие конструкции: условия и циклы

Прогресс сохранится в этом браузере (войдите, чтобы синхронизировать).

Отступы — это синтаксис

Главная визуальная особенность Python: блоки кода выделяются не фигурными скобками, а отступами. Стандарт — 4 пробела. Все строки одного блока должны иметь одинаковый отступ:

age = 20

if age >= 18:
    print("Совершеннолетний")    # внутри блока if
    print("Доступ разрешён")     # тоже внутри
print("Эта строка выполнится всегда")   # вне блока if

Отсутствие или лишний отступ — это IndentationError, одна из самых частых ошибок новичков. Поэтому настройте редактор так, чтобы клавиша Tab вставляла 4 пробела (в VS Code так по умолчанию).

Условие if / elif / else

Условный оператор выбирает ветку выполнения в зависимости от истинности выражения:

score = 75

if score >= 90:
    grade = "Отлично"
elif score >= 70:
    grade = "Хорошо"
elif score >= 50:
    grade = "Удовлетворительно"
else:
    grade = "Неуд"

print(f"Оценка: {grade}")   # Оценка: Хорошо
  • if — первая проверка (обязательно).
  • elif — дополнительные проверки (от нуля и больше).
  • else — ветка «иначе», без условия (может отсутствовать).

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

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

age = 25
has_ticket = True

if age >= 18:
    if has_ticket:
        print("Проход разрешён")
    else:
        print("Нужен билет")
else:
    print("Только для взрослых")

Глубокие вложенности лучше избегать — их можно переписать через and/or или ранний return в функциях.

Истинность значений

В условии можно указать не только bool — Python сам преобразует значение. Ложными (falsy) считаются: 0, 0.0, "", None, пустые коллекции ([], {}). Всё остальное — истинно:

name = ""
if name:
    print(f"Привет, {name}")
else:
    print("Имя не задано")    # выполнится это

Цикл for

Цикл for перебирает элементы любой последовательности (строки, списка, диапазона):

# Перебор строки
for char in "Python":
    print(char)
# P y t h o n (каждый символ с новой строки)

# Перебор списка
fruits = ["яблоко", "банан", "груша"]
for fruit in fruits:
    print(fruit)

range() — диапазон чисел

Функция range() генерирует последовательность чисел. Идеальна для цикла «N раз»:

for i in range(5):        # 0, 1, 2, 3, 4
    print(i)

for i in range(2, 6):    # 2, 3, 4, 5 (старт, стоп)
    print(i)

for i in range(0, 10, 2):  # 0, 2, 4, 6, 8 (старт, стоп, шаг)
    print(i)

enumerate() — индекс и значение

Часто нужен не только элемент, но и его номер. Вместо ручного счётчика используйте enumerate():

fruits = ["яблоко", "банан", "груша"]
for index, fruit in enumerate(fruits):
    print(f"{index + 1}. {fruit}")
# 1. яблоко
# 2. банан
# 3. груша

Цикл while

Цикл while повторяется, пока условие истинно. Используется, когда заранее неизвестно, сколько итераций нужно:

count = 3
while count > 0:
    print(f"Осталось: {count}")
    count -= 1
print("Пуск!")

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

# Бесконечный цикл (так делать НЕ надо без break)
# while True:
#     print("бесконечно")

break и continue

  • break — немедленно прерывает цикл.
  • continue — пропускает оставшуюся часть итерации и переходит к следующей.
# Найти первое число, кратное 7
for n in range(1, 100):
    if n % 7 == 0:
        print(f"Нашли: {n}")   # 7
        break

# Пропустить нечётные
for n in range(5):
    if n % 2 != 0:
        continue
    print(n)   # 0, 2, 4

Цикл с else (редкая, но полезная фича)

У Python-цикла есть блок else, который выполняется, если цикл завершился без break:

for n in range(2, 10):
    if 10 % n == 0:
        print(f"Делитель: {n}")
        break
else:
    print("Делителей нет")   # не выполнится, т.к. был break

Вложенные циклы

Цикл внутри цикла — для двумерных структур (таблицы, матрицы):

# Таблица умножения
for i in range(1, 4):
    for j in range(1, 4):
        print(f"{i} x {j} = {i * j}", end="  ")
    print()   # переход на новую строку

Конструкция match / case (Python 3.10+)

match — это аналог switch в других языках. Удобен, когда нужно сравнить значение с несколькими вариантами:

command = input("> ")

match command:
    case "start":
        print("Запускаем")
    case "stop":
        print("Останавливаем")
    case "help":
        print("Доступные команды: start, stop, help")
    case _:
        print("Неизвестная команда")

_ — это «wildcard», срабатывает, если ни один вариант не подошёл (аналог else).

Сопоставление с образцом

match умеет не просто сравнивать значения, но и разбирать структуру:

point = (3, 4)

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})")

Кейс из реального проекта: меню CLI-приложения

Типичный сценарий — главное меню программы, которое крутится в цикле и реагирует на команды пользователя. Здесь сошлись while, match и break:

tasks = []

while True:
    print("\n--- Менеджер задач ---")
    print("1. Добавить задачу")
    print("2. Показать задачи")
    print("3. Выйти")
    choice = input("Выбор: ")

    match choice:
        case "1":
            title = input("Название задачи: ")
            tasks.append(title)
            print(f"Добавлено: {title}")
        case "2":
            if not tasks:
                print("Список пуст")
            else:
                for i, task in enumerate(tasks, start=1):
                    print(f"{i}. {task}")
        case "3":
            print("До свидания!")
            break
        case _:
            print("Неизвестный выбор")

Это уже почти готовый скелет финального проекта курса — в главе 10 мы его доведём до ума.

Типичные ошибки

1. Забытый символ двоеточия

# if age > 18         # SyntaxError: expected ':'
if age > 18:           # правильно
    ...

2. Отступ после двоеточия

if age > 18:
print("Совершеннолетний")   # IndentationError

3. Зацикливание while

count = 5
while count > 0:
    print(count)
    # забыли count -= 1 — будет бесконечный цикл

Практика

  1. Напишите программу, которая по числу от 1 до 12 выводит название времени года.
  2. Посчитайте сумму всех чисел от 1 до 100 через for и range().
  3. Дано число. Выведите его цифры в обратном порядке через while и % 10.
  4. Найдите все простые числа до 50 (с break во внутреннем цикле).
  5. Напишите простое меню через match с командами add, list, exit.

Итог

Мы изучили управляющие конструкции Python: условный оператор if/elif/else, циклы for (перебор и range) и while, break/continue и современную конструкцию match/case. Запомните: отступы в Python — это синтаксис, двоеточие перед блоком обязательно. В следующей главе переходим к первой структуре данных — спискам и кортежам.

Содержание серии (10)
{# Звук celebration (этап 4.3):