Основы Python: от логики алгоритмов до автоматизации задач

Курс предназначен для начинающих и охватывает путь от понимания принципов работы компьютера до написания самостоятельных скриптов. Вы освоите базовый синтаксис Python, научитесь управлять логикой программ и структурировать данные для решения практических задач.

1. Основы информатики и логика алгоритмов

Основы информатики и логика алгоритмов

Представьте, что вы объясняете иностранцу, не знающему русского языка, как заварить чай. Вы не можете просто сказать «сделай чай», вам придется разбить процесс на элементарные, неделимые действия: «возьми чайник», «наполни его водой», «поставь на плиту». В программировании ситуация еще радикальнее. Компьютер — это невероятно быстрый, но абсолютно лишенный воображения исполнитель. Он не понимает контекста и не умеет догадываться. Все, что мы называем «искусственным интеллектом» или «сложными программами», в своей основе состоит из простейших логических кирпичиков.

Как компьютер «думает» на самом деле

Для человека число 10 — это единица и ноль. Для компьютера это последовательность электрических сигналов. На самом низком уровне процессор оперирует только двумя состояниями: «ток есть» и «тока нет». Это и есть бинарная логика (двоичная система счисления). Каждая такая единица информации называется бит.

Однако программисту не нужно писать нули и единицы. Мы работаем на «высоком уровне», используя языки вроде Python, которые переводят наши человекоподобные команды в машинный код. Важно понимать: компьютер не обладает сознанием. Он лишь выполняет алгоритм — четкую последовательность инструкций, ведущую к конкретному результату за конечное число шагов. Если в рецепте борща пропустить пункт «почистить свеклу», компьютер сварит суп с грязной свеклой и не почувствует подвоха.

Информацию компьютер хранит в памяти, которую можно представить как бесконечный ряд почтовых ящиков. У каждого ящика есть адрес, и в каждом лежит листок с данными. Когда вы работаете в Excel, каждая ячейка — это по сути такой ящик. Программирование позволяет нам не просто вписывать значения в ячейки, а создавать сложные правила взаимодействия между ними.

Анатомия алгоритма: от рецепта к коду

Любой алгоритм, вне зависимости от его сложности, строится на трех базовых конструкциях. Исследователи Коррадо Бём и Джузеппе Якопини еще в 1966 году доказали, что этих трех структур достаточно для описания любой вычислимой функции.

  • Следование (Линейный алгоритм). Это выполнение команд строго друг за другом. Как в инструкции по сборке мебели: шаг 1, шаг 2, шаг 3. Если вы перепутаете шаги, шкаф не соберется.
  • Ветвление (Условие). Это выбор пути. «Если на улице дождь, возьми зонт, иначе надень кепку». В Excel вы использовали для этого функцию ЕСЛИ(). В программировании это фундамент принятия решений.
  • Цикл (Повторение). Это многократное выполнение одного и того же действия, пока соблюдается условие. «Пока в кастрюле есть место, добавляй картошку».
  • Рассмотрим пример из офисной жизни: обработка входящих писем. Линейный алгоритм заставил бы вас открыть письмо, прочитать и закрыть. Но реальная работа — это алгоритм с ветвлением и циклом: «Пока в папке "Входящие" есть непрочитанные письма (цикл), открой письмо. Если в теме есть слово "Счет" (ветвление), перешли его в бухгалтерию, иначе — удали».

    Пошаговый разбор: Алгоритм поиска минимального числа

    Представьте, что перед вами лежит стопка из 100 листов, на каждом из которых написано случайное число. Вам нужно найти самое маленькое. Вы не можете увидеть все числа сразу — только по одному. Как вы будете действовать?

    * Шаг 1: Инициализация. Возьмите первый лист. Назовем число на нем «Текущий минимум». Пока это лучшее, что у нас есть. * Шаг 2: Итерация (повторение). Перейдите к следующему листу в стопке. * Шаг 3: Сравнение (ветвление). Сравните число на новом листе с нашим «Текущим минимумом». * Шаг 4: Обновление. Если новое число меньше, чем «Текущий минимум», забудьте старое значение и запишите новое как «Текущий минимум». Если нет — ничего не делайте. * Шаг 5: Проверка завершения. Остались ли еще листы в стопке? Если да, вернитесь к шагу 2. Если нет — перейдите к финалу. * Шаг 6: Результат. Число, которое осталось в вашей памяти как «Текущий минимум», и есть самое маленькое в стопке.

    Почему мы делаем именно так? Компьютер не может «охватить взглядом» массив данных. Он обрабатывает их последовательно. Этот алгоритм гарантирует результат, сколько бы листов ни было в стопке — 10 или 10 миллионов. Разница будет только во времени выполнения.

    Эффективность и сложность: почему это важно

    Не все алгоритмы одинаково хороши. Представьте, что вам нужно найти человека в телефонной книге. Вы можете листать страницы по одной с самого начала (линейный поиск). Если в книге 1000 страниц, в худшем случае вы сделаете 1000 операций.

    А теперь попробуйте бинарный поиск: откройте книгу ровно посередине. Фамилия на «М», а вам нужно на «В»? Значит, вся вторая половина книги вам не нужна. Вы выбрасываете 500 страниц одним движением. Снова делите оставшуюся часть пополам. Для поиска в книге из 1000 страниц вам понадобится не более 10 шагов.

    В программировании это называется алгоритмической сложностью. Часто новички пишут код, который работает на маленьких данных, но «зависает», когда данных становится много. Например, если ваш скрипт для обработки Excel-таблицы на 100 строк работает секунду, это не значит, что на 100 000 строк он потратит 1000 секунд. При плохом алгоритме время может вырасти в миллионы раз.

    > Ключевой инсайт: > Программирование — это не заучивание команд языка, а умение разбивать задачу на такие мелкие и логичные шаги, которые сможет выполнить даже «глупая» машина. Язык Python — лишь инструмент для записи этих шагов.

    Если из этой главы запомнить три вещи — это:

  • Компьютер выполняет инструкции буквально, без учета контекста и здравого смысла.
  • Любая сложная задача состоит из комбинации следования, ветвления и циклов.
  • Эффективность алгоритма определяется тем, как растет количество операций при увеличении объема данных.
  • 2. Первые шаги в Python: переменные и типы данных

    Первые шаги в Python: переменные и типы данных

    В предыдущей главе мы выяснили, что компьютер хранит данные в ячейках памяти. В Python нам не нужно знать физические адреса этих ячеек. Мы используем переменные — именованные контейнеры. Если провести аналогию с Excel, то переменная — это имя ячейки, а её содержимое — значение. Но в отличие от Excel, где тип данных в ячейке часто определяется автоматически и неявно, в Python понимание типов данных критически важно для того, чтобы программа не «сломалась».

    Что такое переменная и как её называть

    Создание переменной в Python называется присваиванием. Мы пишем имя, ставим знак = (это не математическое равенство, а команда «положи значение справа в ящик слева») и само значение. Например, salary = 50000.

    Имена переменных должны быть понятными. Программист читает код гораздо чаще, чем пишет его. Назвать переменную s — плохо, назвать monthly_salary — хорошо. Существует стандарт PEP 8, который рекомендует использовать маленькие буквы и подчеркивания для разделения слов (стиль snake_case).

    Важная особенность Python — динамическая типизация. Это значит, что переменная не привязана к одному типу навсегда. Сегодня в box лежит число, а завтра вы можете положить туда текст. Однако внутри одной операции Python строго следит за типами: вы не можете сложить число и слово «яблоко», программа выдаст ошибку.

    Основные типы данных

    В Python все данные делятся на типы. Самые важные для новичка:

  • Integers (int) — целые числа. Например, 10, -5, 0. Используются для счета объектов, где не может быть половинок (количество сотрудников, номер страницы).
  • Floats (float) — числа с плавающей точкой (дробные). Например, 3.14, 0.5, -10.0. Обратите внимание: в программировании разделителем всегда служит точка, а не запятая.
  • Strings (str) — строки или текст. Всегда заключаются в кавычки: 'Привет' или "Python". Для Python нет разницы между одинарными и двойными кавычками, главное — чтобы они были одинаковыми с обеих сторон.
  • Booleans (bool) — логический тип. Имеет всего два значения: True (Истина) и False (Ложь). Это результат проверки любого условия.
  • Представьте, что вы создаете карточку товара в интернет-магазине. Имя товара — это str, цена — float (могут быть копейки), количество на складе — int, а наличие скидки — bool.

    Операции с данными: не только арифметика

    С числами все привычно: +, -, , /. Но есть и специфические операторы. Например, * возводит в степень, а % находит остаток от деления. Остаток от деления часто используют, чтобы проверить, является ли число четным: если число % 2 равно 0, то оно четное.

    Со строками тоже можно проводить «арифметику». Сложение строк ('Кот' + 'енок') называется конкатенацией и просто склеивает их. А если умножить строку на число ('А' * 5), вы получите 'AAAAA'.

    > Важный нюанс: > Если вы получили данные от пользователя (например, через форму ввода), они всегда приходят в виде строки. Даже если пользователь ввел «100», для Python это текст. Чтобы прибавить к нему 5, вам нужно сначала превратить строку в число с помощью функции int(). Это называется приведением типов.

    Пошаговый разбор: Расчет стоимости заказа

    Допустим, нам нужно написать часть кода для кассового аппарата. У нас есть цена товара, его количество и персональная скидка клиента.

    * Шаг 1: Объявление переменных. price = 1250.50 (цена за единицу) quantity = 3 (сколько штук покупают) discount_percent = 10 (скидка в процентах) * Шаг 2: Расчет промежуточного итога. subtotal = price * quantity Здесь Python умножает float на int и автоматически получает float (3751.5). * Шаг 3: Вычисление суммы скидки. discount_amount = subtotal * (discount_percent / 100) Мы делим целое число на целое. В Python 3 обычное деление / всегда дает float. * Шаг 4: Итоговая сумма. total = subtotal - discount_amount * Шаг 5: Вывод результата. Чтобы показать это человеку, мы можем собрать строку: print("Итого к оплате: " + str(total)) Здесь мы принудительно превращаем число обратно в строку, чтобы склеить её с текстом.

    Ошибки новичков: путаница с типами

    Частая ситуация: вы пытаетесь сложить input_data = "10" и base_value = 20. Вы ожидаете 30, но Python видит попытку сложить «текст» и «число» и останавливает программу.

    Другой пример — точность чисел с плавающей точкой. Из-за особенностей двоичной системы компьютеры иногда считают 0.1 + 0.2 как 0.30000000000000004. Для финансовых расчетов (где важна каждая копейка) в Python используют специальные инструменты, но для обычных задач достаточно помнить об этой особенности.

    Таблица соответствия типов данных:

    | Тип в Python | Описание | Пример | | :--- | :--- | :--- | | int | Целое число | 42 | | float | Дробное число | 3.14 | | str | Текст (строка) | "Hello" | | bool | Логика | True |

    Если из этой главы запомнить три вещи — это:

  • Переменная — это имя для значения, которое хранится в памяти.
  • Тип данных определяет, что с этим значением можно делать (складывать как числа или склеивать как текст).
  • Перед математическими операциями с данными, введенными пользователем, их нужно явно преобразовывать в числа.
  • 3. Управление логикой программы: условия и циклы

    Управление логикой программы: условия и циклы

    Программа, которая просто складывает два числа, полезна, но примитивна. Настоящая магия начинается тогда, когда код начинает «принимать решения» и выполнять рутинную работу за нас. Для этого используются управляющие конструкции: ветвления и циклы. Если переменные — это существительные нашего кода, то условия и циклы — это глаголы и союзы, создающие сюжет.

    Ветвление: оператор if

    В основе любого выбора лежит проверка условия. Условие — это выражение, которое всегда превращается в True (истину) или False (ложь). Например, ` или name == "Admin".

    В Python ветвление записывается с помощью ключевого слова if (если).

    Обратите внимание на двоеточие в конце строки и отступ перед следующей строкой. В Python отступы — это не просто украшение, а способ показать компьютеру, какие команды относятся к условию, а какие — нет. Если условие не выполнено, код с отступом просто проигнорируется.

    Для более сложных случаев есть else (иначе) и elif (сокращение от else if — «а если»). Это позволяет выстраивать цепочки: «Если баланс больше 1000 — купи бифштекс, а если больше 100 — купи хлеб, иначе — иди работать».

    Логические операторы: AND, OR, NOT

    Иногда одного условия мало. Нам нужно проверить несколько факторов сразу. * and (и): истинно, только если ОБА условия верны. (возраст >= 18) and (есть_билет == True). * or (или): истинно, если верен ХОТЯ БЫ ОДИН из вариантов. (день == "Суббота") or (день == "Воскресенье"). * not (не): инверсия. Превращает правду в ложь и наоборот.

    Пример из жизни: банк выдает кредит, если (зарплата > 50000) и (возраст < 65). Если хотя бы один параметр не подходит, в кредите будет отказано.

    Циклы: избавляемся от рутины

    Циклы позволяют выполнять один и тот же блок кода многократно. В Python два основных вида циклов:

  • Цикл while (пока). Он работает, пока условие остается истинным. Это похоже на проверку: «Пока в чайнике есть вода, лей её в чашку». Нужно быть осторожным: если условие всегда будет True, программа попадет в «бесконечный цикл» и зависнет.
  • Цикл for (для каждого). Это самый популярный цикл в Python. Он перебирает элементы в последовательности (например, буквы в слове или числа в диапазоне).
  • Представьте, что вам нужно отправить 1000 писем. Вместо того чтобы писать команду отправки 1000 раз, вы пишете: Для каждого адреса в списке — отправить письмо.

    Пошаговый разбор: Система контроля качества

    Представьте конвейер на заводе, который проверяет вес деталей. Нормальный вес — от 145 до 155 грамм. Если деталь бракованная, её нужно отправить в корзину. В конце нужно вывести общее число брака.

    * Шаг 1: Подготовка. Создаем переменную-счетчик: bad_items_count = 0. * Шаг 2: Запуск цикла. Мы знаем, что у нас 10 деталей. Используем for i in range(10):. Функция range(10) создает последовательность от 0 до 9. * Шаг 3: Получение данных. Внутри цикла «считываем» вес детали (в реальности это может быть ввод с датчика или из файла). Пусть это будет weight = float(input()). * Шаг 4: Проверка условия (ветвление). if weight < 145 or weight > 155: Если вес меньше нормы ИЛИ больше нормы — это брак. * Шаг 5: Действие при браке. bad_items_count = bad_items_count + 1 (увеличиваем счетчик на 1). * Шаг 6: Завершение. После того как цикл прогнал все 10 деталей, выводим итог: print("Найдено брака: ", bad_items_count).

    Нюансы и типичные ошибки

    Главная ловушка новичков — путаница со знаком равенства. * = — это присваивание (положить значение в переменную). * == — это сравнение (проверить, равны ли значения). Если вы напишете if x = 10, Python выдаст ошибку, потому что внутри if нельзя менять значение переменной, там нужно спрашивать «равно ли?».

    Еще один важный момент — вложенные конструкции. Вы можете поставить if внутри цикла или другой if внутри первого. Например: «Если сегодня рабочий день (внешний if), то для каждого часа с 9 до 18 (цикл) проверяй почту». Главное — следить за уровнями отступов. Каждый новый уровень отступа — это «матрешка», которая находится внутри предыдущей.

    Сравнение циклов:

    | Характеристика | Цикл while | Цикл for` | | :--- | :--- | :--- | | Когда использовать | Когда не знаем заранее, сколько будет повторений | Когда есть четкий набор элементов или диапазон | | Риск | Можно создать бесконечный цикл | Почти исключен риск бесконечного цикла | | Пример | "Жди нажатия кнопки" | "Прочитай все строки в файле" |

    Если из этой главы запомнить три вещи — это:

  • Отступы в Python определяют логическую структуру кода и обязательны.
  • Условия позволяют программе выбирать путь исполнения, опираясь на логику True/False.
  • Циклы — главный инструмент автоматизации, позволяющий запустить одну и ту же логику для любого объема данных.
  • 4. Организация кода: функции и структуры данных

    Организация кода: функции и структуры данных

    Когда ваши программы становятся длиннее 20 строк, хранить все данные в отдельных переменных, а действия — в одном сплошном списке команд, становится невозможно. Это как пытаться управлять библиотекой, где все книги свалены в одну кучу. Чтобы навести порядок, программисты используют структуры данных (для хранения) и функции (для организации действий).

    Списки: когда переменных слишком много

    Представьте, что вы ведете список покупок. Создавать переменные item1, item2, item3 крайне неудобно. В Python для этого есть списки (lists). Список — это упорядоченная коллекция элементов, заключенная в квадратные скобки: shopping_list = ["Молоко", "Хлеб", "Яблоки"].

    У каждого элемента в списке есть свой «адрес» — индекс. Важнейшее правило программирования: индексация начинается с нуля. * shopping_list[0] — это "Молоко". * shopping_list[1] — это "Хлеб".

    Списки динамичны. Вы можете добавлять элементы (.append()), удалять их или менять. Списки идеально работают в паре с циклом for. Вы можете сказать: «Для каждого товара в моем списке — напечатай его название и цену». Это основа обработки больших массивов данных, будь то строки из Excel-таблицы или база данных клиентов.

    Функции: ваш личный «черный ящик»

    Функция — это именованный фрагмент кода, который можно вызывать многократно в разных частях программы. Представьте функцию как кухонный комбайн: вы загружаете в него продукты (аргументы), он выполняет заложенную в него программу и выдает результат (возвращаемое значение).

    Зачем нужны функции?

  • Избавление от дублирования. Если вы 10 раз в коде считаете налог на прибыль, лучше написать одну функцию calculate_tax() и вызывать её.
  • Читаемость. Код send_report(prepare_data(raw_info)) читается как человеческое предложение.
  • Упрощение отладки. Если в расчете налога ошибка, вам нужно исправить её только в одном месте — внутри функции.
  • Функция объявляется словом def (от английского define — определить). У неё могут быть входные данные в скобках и результат, который она отдает через return.

    Пошаговый разбор: Анализатор цен

    Допустим, у нас есть список цен на товары, и нам нужно быстро узнать: сколько товаров стоят дороже 1000 рублей и какова их средняя цена.

    * Шаг 1: Исходные данные. Создаем список: prices = [800, 1200, 500, 2500, 1100]. * Шаг 2: Создание функции. * Шаг 3: Вызов функции. Мы передаем наш список prices в функцию и сохраняем результат в новую переменную: result = analyze_prices(prices). * Шаг 4: Обработка результата. Теперь у нас есть список [1200, 2500, 1100]. Мы можем легко посчитать его длину функцией len(result) и среднее арифметическое.

    Этот подход позволяет нам использовать одну и ту же функцию analyze_prices для любых списков — цен на продукты, стоимости билетов или зарплат сотрудников.

    Словари: данные по ключу

    Иногда списка мало. Если вам нужно хранить информацию о сотруднике, список ["Иван", 35, "Менеджер"] неудобен — легко забыть, что под индексом 1 скрывается возраст, а не стаж. Для таких случаев есть словари (dictionaries).

    В словаре данные хранятся парами «ключ: значение». employee = {"name": "Иван", "age": 35, "position": "Менеджер"}. Теперь вы можете обратиться к данным по понятному имени: employee["name"]. Это очень похоже на то, как мы ищем слово в обычном бумажном словаре: ищем ключ (слово) и получаем значение (перевод).

    > Инсайт по структурам данных: > Выбор правильной структуры — это 50% успеха. Если данные важны по порядку — берите список. Если данные связаны по смыслу (как поля в анкете) — берите словарь.

    Сравнение структур данных:

    | Структура | Синтаксис | Главная фишка | Применение | | :--- | :--- | :--- | :--- | | Список | [a, b, c] | Порядок и индексы | Список дел, очередь, массив чисел | | Словарь | {"k": "v"} | Доступ по имени (ключу) | Карточка клиента, настройки программы |

    Если из этой главы запомнить три вещи — это:

  • Индексация в списках начинается с 0, и это нужно учитывать при доступе к элементам.
  • Функции позволяют упаковать логику в переиспользуемые блоки, делая код чище.
  • Программы — это не просто набор команд, а взаимодействие структур данных (списков, словарей) и функций, которые их обрабатывают.
  • 5. Прикладное программирование: создание полезных скриптов

    Прикладное программирование: создание полезных скриптов

    Мы прошли путь от логики алгоритмов до организации кода в функции. Теперь пора соединить все части пазла, чтобы решить реальную задачу. Программирование для автоматизации — это не создание сложных игр или нейросетей. Это написание небольших программ (скриптов), которые делают за вас скучную работу: переименовывают файлы, собирают отчеты из разных таблиц или рассылают уведомления.

    Как подступиться к автоматизации

    Любая задача по автоматизации решается в три этапа:

  • Ввод (Input): Откуда мы берем данные? (Файл Excel, папка на диске, текст из интернета).
  • Обработка (Process): Что мы с ними делаем? (Фильтруем, считаем сумму, меняем формат).
  • Вывод (Output): Куда кладем результат? (Новый файл, сообщение в Telegram, запись в базу данных).
  • Главный секрет Python — в огромном количестве библиотек. Библиотека — это чужой код, который уже умеет делать сложные вещи (читать Excel или заходить на сайты), и вы можете просто «подключить» его к себе. Вам не нужно писать код для открытия файла .xlsx с нуля, за вас это уже сделали.

    Работа с файлами и данными

    Чаще всего автоматизация начинается с файлов. В Python есть встроенные инструменты для работы с текстовыми файлами и специальные библиотеки (например, os или pathlib) для работы с папками.

    Представьте, что у вас есть папка с 500 фотографиями, которые называются IMG_001.jpg, IMG_002.jpg и так далее. Вам нужно добавить к названию дату и название проекта. Вручную это займет час. Скрипт на Python сделает это за секунду: он «пробежится» циклом по списку файлов в папке и для каждого вызовет функцию переименования.

    Пошаговый разбор: Скрипт для фильтрации отчета

    Допустим, у вас есть список продаж в формате: {"ID": 101, "сумма": 500, "статус": "оплачено"}. Таких записей тысячи. Вам нужно вытащить только оплаченные заказы на сумму более 1000 рублей и сохранить их в отдельный «чистый» список для бухгалтерии.

    * Шаг 1: Подключение инструментов. Нам понадобится список словарей (имитация данных из таблицы). * Шаг 2: Создание функции-фильтра. * Шаг 3: Логика обработки. Мы вызываем функцию. Внутри неё цикл for перебирает каждый словарь (заказ). Условие if проверяет сразу два критерия через and. * Шаг 4: Сохранение результата. Полученный список valid_orders можно вывести на экран или записать в новый файл.

    Этот шаблон — «прочитать -> проверить условие -> сохранить в список» — является базой для 90% задач автоматизации в офисе.

    Обработка ошибок: чтобы скрипт не падал

    В реальном мире данные «грязные». В колонке «сумма» может оказаться текст «неизвестно», или файл, который вы хотите открыть, может быть удален. Если программа встретит такую ситуацию, она «вылетит» с ошибкой.

    Для этого в Python используется конструкция try ... except (попробуй... кроме).

    Это делает вашу автоматизацию надежной. Хороший скрипт не просто выполняет задачу, он умеет обходить острые углы и сообщать пользователю, что именно пошло не так, вместо того чтобы просто закрыться.

    Куда двигаться дальше?

    Вы освоили фундамент. Теперь, чтобы превратить эти знания в инструмент, стоит изучить:

  • Библиотеку Pandas: это «Excel на стероидах». Она позволяет обрабатывать таблицы с миллионами строк одной командой.
  • Работу с API: чтобы ваш скрипт мог сам брать погоду, курсы валют или отправлять сообщения в мессенджеры.
  • Регулярные выражения: для поиска и замены сложного текста (например, вытащить все номера телефонов из огромного документа).
  • > Финальный совет: > Не пытайтесь сразу написать идеальный код. Сначала сделайте так, чтобы программа просто работала и решала вашу задачу. Оптимизация и красота придут с практикой.

    Если из этого курса вы запомните главное: программирование — это не магия, а конструктор из условий, циклов и функций, — вы уже на голову выше тех, кто просто копирует чужие решения.