1. Управляющие конструкции и циклы
Добро пожаловать в новую статью курса! В предыдущих материалах мы познакомились с переменными и базовыми типами данных. Вы уже умеете сохранять информацию в памяти компьютера, будь то числа, строки или списки. Однако программы, которые просто сохраняют данные и выводят их на экран, не очень полезны. Настоящая сила программирования раскрывается тогда, когда мы начинаем управлять потоком выполнения программы: заставлять её принимать решения и многократно повторять рутинные действия.
Поскольку ваша главная цель — научиться работать с файлами и обрабатывать данные, эта тема станет для вас фундаментальной. Представьте, что вы загрузили из файла список из тысяч транзакций. Вам нужно пропустить ошибочные записи, найти суммы больше определённого значения и подсчитать общий доход. Без управляющих конструкций и циклов сделать это невозможно.
В этой статье мы разберём, как научить Python делать выбор и повторять действия, используя конкретные примеры из области обработки данных.
Условные конструкции: учим программу принимать решения
В реальной жизни мы постоянно принимаем решения на основе условий: «Если пойдёт дождь, я возьму зонт, иначе надену солнечные очки». В программировании этот процесс называется ветвлением. Для его реализации в Python используется конструкция if (если), elif (иначе если) и else (иначе).
Базовый синтаксис if-else
Любое условие в Python опирается на логический тип данных (boolean), который может принимать только два значения: True (истина) или False (ложь). Для сравнения значений мы используем операторы сравнения.
В математике мы привыкли к таким записям: , , . В Python они выглядят так:
> (больше) и < (меньше)>= (больше или равно, аналог )<= (меньше или равно)== (равно — обратите внимание, это два знака равенства, так как один знак = используется для присваивания)!= (не равно)Рассмотрим простой пример. Допустим, мы пишем программу для интернет-магазина, которая определяет, положена ли клиенту бесплатная доставка. Условие: сумма заказа должна превышать 5000 рублей.
Обратите внимание на два критически важных элемента синтаксиса Python:
: в конце строки с условием. Оно говорит интерпретатору: «Дальше пойдёт блок кода, который нужно выполнить, если условие верно».!Схема работы условной конструкции
Множественный выбор с elif
Часто двух вариантов (да/нет) бывает недостаточно. Если нам нужно проверить несколько условий подряд, мы используем elif (сокращение от else if).
Представим, что мы обрабатываем данные о возрасте пользователей для категоризации аудитории:
Программа проверяет условия сверху вниз. Как только она находит первое истинное условие (в нашем случае ), она выполняет соответствующий блок кода и полностью игнорирует все остальные проверки.
Цикл while: повторение до выполнения условия
Слово while переводится с английского как «пока». Цикл while выполняет блок кода до тех пор, пока заданное условие остаётся истинным (True). Это так называемый цикл с предусловием.
Этот цикл идеально подходит для ситуаций, когда мы заранее не знаем, сколько раз нужно выполнить действие. Например, когда мы ждём, пока пользователь введёт корректные данные, или читаем данные из сетевого соединения, пока они не закончатся.
В этом примере цикл выполнится ровно 5 раз. При каждой итерации (так называется один шаг цикла) переменная stock_balance уменьшается на единицу. Когда остаток становится равен нулю, условие становится ложным, и цикл завершает свою работу.
> Важное правило: при работе с циклом while всегда убеждайтесь, что условие когда-нибудь станет ложным. Если вы забудете изменить переменную внутри цикла (например, уберете строку stock_balance = stock_balance - 1), программа уйдёт в бесконечный цикл и зависнет.
Цикл for: главный инструмент обработки данных
Если while нужен для работы с неизвестным количеством повторений, то цикл for — это ваш главный инструмент для перебора известных коллекций данных. В Python цикл for работает как конвейер: он берёт элементы из списка, строки или файла по одному и выполняет с ними заданные действия.
Синтаксис выглядит так: for <переменная> in <коллекция>:.
Давайте рассмотрим практическую задачу. У нас есть список температур, собранных датчиком за неделю. Нам нужно перевести эти значения из градусов Цельсия в градусы Фаренгейта (формула: ) и вывести результат.
Как это работает? При первой итерации переменная temp автоматически принимает значение первого элемента списка (15). Выполняется код внутри цикла. На второй итерации temp становится равна 18, и так далее, пока список не закончится.
!Интерактивная визуализация работы цикла for
Генерация последовательностей: функция range()
Иногда нам нужно просто повторить действие определённое количество раз или сгенерировать последовательность чисел. Для этого используется встроенная функция range().
Функция range() может принимать от одного до трёх аргументов:
range(stop): генерирует числа от 0 до stop - 1.range(start, stop): генерирует числа от start до stop - 1.range(start, stop, step): генерирует числа от start до stop - 1 с шагом step.Пример использования для нумерации строк:
Управление потоком внутри цикла: break и continue
При обработке реальных данных (особенно загруженных из файлов) часто возникают ситуации, когда стандартный ход цикла нужно прервать или скорректировать. Для этого существуют операторы break и continue.
Оператор continue: пропуск итерации
Оператор continue заставляет цикл немедленно прервать текущую итерацию и перейти к следующему элементу. Это невероятно полезно при фильтрации «грязных» данных.
Представьте, что вы обрабатываете список цен, но из-за ошибки выгрузки некоторые значения оказались отрицательными или равными нулю. Их нужно проигнорировать.
В этом коде, когда price становится равен -100, срабатывает условие if. Оператор continue прерывает текущий шаг, поэтому строка с прибавлением суммы не выполняется, и цикл берёт следующее число (3400).
Оператор break: досрочное завершение
Оператор break полностью останавливает работу цикла, даже если в коллекции ещё остались элементы или условие while всё ещё истинно. Это применяется для поиска конкретного элемента, чтобы не тратить ресурсы компьютера на дальнейший перебор.
Допустим, мы ищем в лог-файле (представленном в виде списка строк) критическую ошибку. Как только мы её нашли, дальнейший поиск не имеет смысла — нужно срочно отправлять уведомление администратору.
В этом примере последние две строки списка даже не будут проанализированы, так как цикл завершится сразу после нахождения слова "ERROR".
Вложенные циклы: работа с табличными данными
Поскольку ваша цель — анализ данных, вы неизбежно столкнётесь с таблицами. В Python простейшая таблица представляется как список списков (каждый внутренний список — это строка таблицы). Чтобы обойти такую структуру, используются вложенные циклы — цикл внутри другого цикла.
Рассмотрим пример. У нас есть данные о продажах трёх магазинов за три дня. Нам нужно вывести каждую продажу на экран.
Внешний цикл перебирает строки (магазины), а внутренний — конкретные значения внутри этой строки (продажи по дням). Понимание этой механики станет вашим ключом к успешному чтению и обработке CSV-файлов в будущем.
Практический пример: комплексная обработка данных
Давайте объединим всё, что мы изучили, в одной задаче. У нас есть сырые данные о возрасте группы людей. Нам нужно:
Этот скрипт демонстрирует типичный паттерн обработки данных: мы берём сырой массив, проходим по нему циклом for, используем if и continue для очистки от мусора, и применяем логику для подсчёта нужных метрик.
Освоив условные конструкции и циклы, вы сделали огромный шаг вперёд. Теперь ваши программы могут не просто хранить данные, но и активно с ними взаимодействовать, фильтровать их и извлекать полезную информацию. В следующих статьях мы применим эти знания на практике, научившись открывать настоящие текстовые файлы и извлекать данные прямо с жесткого диска вашего компьютера.