Основы программирования на Python

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

1. Введение в Python: установка среды, переменные и базовые типы данных

Введение в Python: установка среды, переменные и базовые типы данных

Добро пожаловать в курс «Основы программирования на Python». Это первая статья нашего путешествия в мир разработки. Сегодня мы не просто напишем первую программу, но и разберемся, как «думает» компьютер, когда выполняет ваш код, как установить необходимые инструменты и как хранить данные в памяти.

Python — это один из самых популярных языков программирования в мире. Его любят за простоту синтаксиса (правил написания кода), который напоминает обычный английский язык, и за невероятную мощь. На Python пишут веб-сайты, создают искусственный интеллект, анализируют данные, автоматизируют рутинные задачи и даже разрабатывают игры.

Что такое Python и как он работает?

Прежде чем мы начнем писать код, важно понять, что происходит «под капотом». Компьютер не понимает человеческий язык, он понимает только машинный код (нули и единицы). Python — это интерпретируемый язык высокого уровня. Это означает, что вам не нужно самостоятельно переводить команды в нули и единицы. За вас это делает специальная программа — интерпретатор.

!Схема показывает, как исходный код превращается в результат: ваш файл передается интерпретатору, который выполняет инструкции построчно.

Когда вы запускаете программу на Python, интерпретатор читает ваш код строку за строкой и сразу же выполняет его. Это отличает его от компилируемых языков (как C++), где весь код сначала превращается в отдельный исполняемый файл.

Установка среды разработки

Чтобы начать программировать, нам нужно установить интерпретатор Python на ваш компьютер.

Шаг 1: Загрузка

Перейдите на официальный сайт Python.org и скачайте последнюю версию для вашей операционной системы (Windows, macOS или Linux).

Шаг 2: Установка

Запустите скачанный файл.

> ВАЖНО: В окне установки обязательно поставьте галочку напротив пункта Add Python to PATH (Добавить Python в PATH). Если этого не сделать, вы не сможете запускать Python из командной строки, и это вызовет множество проблем в будущем.

Шаг 3: Проверка

После установки откройте терминал (в Windows это командная строка cmd или PowerShell, в macOS/Linux — Terminal) и введите команду:

Если вы видите версию (например, Python 3.10.0), значит, всё прошло успешно.

Ваша первая программа: Hello, World!

Традиционно изучение любого языка начинается с вывода на экран фразы «Hello, World!». В Python это делается всего одной строкой. Мы будем использовать встроенную функцию print().

Откройте IDLE (простая среда разработки, которая устанавливается вместе с Python) или любой текстовый редактор, введите следующий код и запустите его:

Функция print() берет то, что находится внутри скобок, и выводит это в консоль. Обратите внимание, что текст мы заключили в кавычки. Это сообщает Python, что перед ним именно текст, а не команда.

Переменные: коробки для данных

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

Чтобы создать переменную, нужно придумать ей имя и присвоить значение с помощью знака равно =. В программировании этот знак означает не «равно» в математическом смысле, а «присвоить».

Здесь мы создали две «коробки»:

  • Коробку с надписью user_name, в которую положили текст "Alex".
  • Коробку с надписью age, в которую положили число 25.
  • Правила именования переменных

    Имя переменной (идентификатор) не может быть произвольным. Существуют строгие правила:

    * Имя может состоять из букв (латиница), цифр и знака подчеркивания _. * Имя не может начинаться с цифры. * Нельзя использовать пробелы. * Python чувствителен к регистру: age, Age и AGE — это три разные переменные.

    В Python принято использовать стиль snake_case (змеиный регистр): все буквы строчные, а слова разделяются подчеркиванием.

    | Правильно | Неправильно | Почему неправильно | | :--- | :--- | :--- | | my_variable | my variable | Содержит пробел | | user_id_2 | 2user | Начинается с цифры | | total_sum | total-sum | Дефис запрещен (это знак вычитания) |

    Базовые типы данных

    В коробки можно класть разные вещи. В переменную можно положить число, текст или даже список. Тип данных определяет, что именно хранится в переменной и что с этим можно делать. Рассмотрим четыре основных типа.

    1. Целые числа (Integer / int)

    Это числа без дробной части: 5, 100, -20, 0. С ними можно выполнять арифметические операции.

    2. Числа с плавающей точкой (Float)

    Это дробные числа. В программировании для разделения целой и дробной части используется точка, а не запятая.

    Если вы напишете 72,5, Python воспримет это не как одно число, а как перечисление двух разных чисел.

    3. Строки (String / str)

    Строка — это последовательность символов. Любой текст в Python должен быть заключен в кавычки (одинарные ' или двойные ").

    > Важно: Если вы заключите число в кавычки, для компьютера оно станет просто текстом. Вы не сможете прибавить к строке "100" число 5 математически.

    4. Логический тип (Boolean / bool)

    Этот тип данных может принимать только два значения: True (Истина) или False (Ложь). Они часто используются для проверки условий.

    Обратите внимание, что True и False пишутся с большой буквы и без кавычек.

    Динамическая типизация

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

    Чтобы узнать, какой тип данных хранится в переменной прямо сейчас, можно использовать функцию type():

    Ввод данных от пользователя

    Программы становятся полезными, когда они взаимодействуют с пользователем. Для получения данных с клавиатуры используется функция input().

    Когда программа доходит до строчки с input(), она останавливается и ждет, пока пользователь введет текст и нажмет Enter. Введенный текст сохраняется в переменную name.

    > Критически важно: Функция input() всегда возвращает строку (str), даже если пользователь ввел цифры.

    Рассмотрим пример:

    Результатом будет не 15, а 510. Почему? Потому что a и b — это строки "5" и "10". Знак + для строк означает склеивание (конкатенацию), а не сложение.

    Преобразование типов

    Чтобы работать с введенными данными как с числами, их нужно преобразовать (конвертировать). Для этого используются функции int() (в целое) и float() (в дробное).

    Правильный код для сложения:

    Или короче:

    Простейшая математика

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

    * Сложение: + * Вычитание: - Умножение: * Деление: / (результат всегда float, даже если делится нацело) * Целочисленное деление: // (отбрасывает дробную часть) * Остаток от деления: % Возведение в степень: *

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

    где — искомое значение, — переменная, и — константы.

    На Python это будет выглядеть так:

    Комментарии в коде

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

    В Python комментарий начинается с символа решетки #. Всё, что написано после этого символа в той же строке, игнорируется интерпретатором.

    Заключение

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

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

    2. Управление потоком выполнения: условные операторы и циклы

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

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

    Однако реальная жизнь (и реальные программы) требуют гибкости. Что, если пользователь ввел неправильный пароль? Что, если нам нужно обработать тысячу фотографий, а не одну? Здесь на сцену выходит управление потоком выполнения (Control Flow).

    Сегодня мы научим нашу программу принимать решения и повторять действия. Мы превратим наш «поезд» в умный автомобиль с навигатором.

    Условные операторы: искусство выбора

    В основе любой интеллектуальной системы лежит умение отвечать на вопрос «Если... то...». В Python за это отвечает оператор if (если).

    Синтаксис и отступы

    В большинстве языков программирования (C++, Java, JavaScript) блоки кода выделяются фигурными скобками {}. Python пошел своим путем. Здесь структуру кода определяют отступы (indentation). Это делает код чистым и читаемым, но требует внимательности.

    Стандартный отступ в Python — это 4 пробела.

    Рассмотрим простейший пример:

    Обратите внимание на двоеточие : после условия. Оно обязательно. Все строки, которые имеют отступ после if, будут выполнены только если условие истинно (True). Как только отступ исчезает, блок условия заканчивается.

    !Схема работы оператора if: код внутри блока выполняется только при истинности условия.

    Ветвление: else и elif

    Часто нам нужно не просто выполнить действие при успехе, но и предусмотреть альтернативный сценарий. Для этого используется else (иначе).

    Если вариантов больше двух, на помощь приходит elif (сокращение от else if — иначе если).

    Python проверяет условия сверху вниз. Как только он находит первое истинное условие, он выполняет его блок и пропускает остальные проверки в этой конструкции.

    Операторы сравнения

    Чтобы задавать условия, нам нужны инструменты сравнения. Результатом работы этих операторов всегда является логический тип (bool: True или False).

    | Оператор | Описание | Пример (x=5, y=10) | | :--- | :--- | :--- | | == | Равно (не путать с =) | x == y -> False | | != | Не равно | x != y -> True | | > | Больше | x > y -> False | | < | Меньше | x < y -> True | | >= | Больше или равно | x >= 5 -> True | | <= | Меньше или равно | y <= 10 -> True |

    > Важно: Самая частая ошибка новичков — использование одного знака равно = (присваивание) вместо двух == (сравнение) внутри условия if.

    Логические операторы

    Иногда нужно проверить несколько условий одновременно. Например, чтобы получить скидку, клиент должен быть старше 60 лет ИЛИ иметь карту лояльности.

    * and (И): Истинно, только если оба условия истинны. * or (ИЛИ): Истинно, если хотя бы одно условие истинно. * not (НЕ): Инвертирует значение (меняет True на False и наоборот).

    Циклы: сила повторения

    Представьте, что вам нужно вывести на экран числа от 1 до 100. Писать 100 раз print() — плохая идея. В программировании для повторения действий используются циклы.

    Цикл while (Пока)

    Цикл while выполняет блок кода до тех пор, пока условие остается истинным. Это похоже на повторяющийся if.

    Опасность: Если вы забудете изменить переменную, участвующую в условии (в нашем случае count), условие всегда будет истинным, и программа уйдет в бесконечный цикл. Она зависнет, и ее придется останавливать принудительно.

    Цикл for (Для)

    Цикл for в Python устроен иначе, чем в старых языках программирования. Он предназначен для перебора последовательностей (например, букв в строке или элементов в списке).

    В этом примере переменная letter на каждой итерации (повторении) будет принимать значение следующей буквы из строки "Python".

    Функция range()

    Если нам нужно просто повторить действие раз или получить последовательность чисел, мы используем функцию range().

    Синтаксис: range(start, stop, step) * start: начало (по умолчанию 0) * stop: конец (не включается!) * step: шаг (по умолчанию 1)

    Математический пример: Сумма арифметической прогрессии

    Давайте решим задачу. Нам нужно найти сумму всех чисел от 1 до 100. Мы можем сделать это циклом:

    Однако, в математике для этого существует формула суммы арифметической прогрессии:

    Где: * — сумма первых членов прогрессии. * — количество суммируемых чисел (в нашем случае 100). * — первый член последовательности (1). * — последний член последовательности (100).

    Если мы реализуем эту формулу, результат будет тем же, но программа выполнится быстрее, так как ей не нужно делать 100 повторений.

    Управление внутри цикла: break и continue

    Иногда нам нужно вмешаться в работу цикла прямо в процессе выполнения.

    break (Прервать)

    Команда break немедленно останавливает цикл и выходит из него, даже если условие продолжения все еще истинно.

    continue (Продолжить)

    Команда continue прерывает текущую итерацию и переходит к следующей. Код, написанный после continue внутри цикла, не выполнится для текущего шага.

    !Визуальное различие: break ломает цикл полностью, continue перескакивает на следующий круг.

    Вложенные конструкции

    Вы можете вкладывать циклы в условия, условия в циклы и циклы в циклы. Главное — следить за отступами.

    В этом примере внутренний цикл полностью выполнится 3 раза — по одному разу для каждого шага внешнего цикла.

    Заключение

    Теперь ваша программа — это не просто линейный сценарий. Она умеет анализировать данные, принимать решения на основе условий и автоматизировать рутинные повторения. Условные операторы if и циклы for/while — это скелет логики любого алгоритма.

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

    3. Структуры данных: списки, кортежи, словари и множества

    Структуры данных: списки, кортежи, словари и множества

    В прошлых статьях мы научились хранить одиночные данные в переменных: одно число, одну строку, одно значение True или False. Мы также научились управлять потоком программы с помощью циклов и условий. Но что, если нам нужно работать с сотней имен пользователей, тысячей товаров в магазине или базой данных температур за год?

    Создавать тысячу переменных (item1, item2, item3...) — это тупиковый путь. Нам нужны контейнеры, способные хранить наборы данных. В Python такие контейнеры называются структурами данных. Сегодня мы разберем «большую четверку» встроенных структур: списки, кортежи, словари и множества.

    Списки (Lists): Универсальные коробки

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

    Создание списка

    Списки создаются с помощью квадратных скобок []. Элементы внутри разделяются запятыми.

    Индексация: Доступ к элементам

    Самое важное правило программирования: счет начинается с нуля. Первый элемент списка имеет индекс 0, второй — 1, и так далее.

    !Схема индексации списка: прямой порядок от 0 и обратный от -1.

    Python также поддерживает отрицательную индексацию. Индекс -1 означает последний элемент, -2 — предпоследний.

    Изменение списков

    Списки — это изменяемый (mutable) тип данных. Мы можем менять содержимое «на лету».

    Срезы (Slicing)

    Иногда нам нужна только часть списка. Для этого используются срезы: список[старт:стоп:шаг].

    Кортежи (Tuples): Защищенные списки

    Кортеж — это брат-близнец списка, но с одним критическим отличием: он неизменяем (immutable). После создания кортежа вы не можете добавить, удалить или заменить в нем элементы.

    Кортежи создаются с помощью круглых скобок ().

    Если вы попытаетесь сделать coordinates[0] = 10.0, Python выдаст ошибку.

    Зачем нужны кортежи, если есть списки?

  • Защита данных: Если вы передаете в программу координаты GPS или настройки сервера, вы хотите быть уверены, что никто случайно их не изменит.
  • Скорость: Кортежи занимают меньше памяти и работают быстрее списков.
  • Словари (Dictionaries): Ключ к успеху

    Списки удобны, когда данные упорядочены. Но что, если нам нужно найти телефон человека по его имени? Искать имя в списке, запоминать индекс и искать телефон по тому же индексу в другом списке — неудобно.

    Здесь на помощь приходят словари. Это неупорядоченная коллекция пар «Ключ: Значение».

    Создание и доступ

    Словари создаются с помощью фигурных скобок {}.

    Здесь "Alex" — это ключ, а номер телефона — значение. Чтобы получить значение, мы обращаемся к словарю по ключу (как в списке по индексу, только вместо числа — имя ключа).

    !Принцип работы словаря: доступ к данным осуществляется по уникальному ключу, а не по порядковому номеру.

    Операции со словарями

    Множества (Sets): Уникальность превыше всего

    Множество — это коллекция уникальных элементов. В множестве нет порядка (нельзя обратиться по индексу) и не может быть дубликатов.

    Представьте мешок, в который вы кидаете цветные шарики. Если вы кинете туда красный шарик, а там уже есть такой же, второй просто исчезнет.

    Создание множества

    Используются фигурные скобки {}, как в словарях, но без двоеточий. Или функция set().

    Математика множеств

    Множества в Python основаны на математической теории множеств. Это позволяет легко находить пересечения и объединения.

    Допустим, у нас есть два множества студентов:

    Мы можем использовать формулу объединения множеств:

    где — количество элементов в объединении (все уникальные студенты), и — количество студентов в каждой группе, а — количество студентов, которые есть в обеих группах одновременно (пересечение).

    В Python это делается проще:

    Сводная таблица: Что выбрать?

    Выбор правильной структуры данных — половина успеха программы.

    | Структура | Синтаксис | Упорядоченность | Изменяемость | Уникальность | Для чего использовать | | :--- | :--- | :--- | :--- | :--- | :--- | | Список | [1, 2] | Да | Да | Нет | Коллекции однотипных или разных данных, которые нужно менять | | Кортеж | (1, 2) | Да | Нет | Нет | Координаты, настройки, данные, которые нельзя менять | | Словарь | {"k": "v"} | Нет (до 3.7)* | Да | Ключи уникальны | Хранение данных пар "объект-свойство", базы данных | | Множество | {1, 2} | Нет | Да | Да | Удаление дубликатов, математические операции |

    > Начиная с Python 3.7, словари сохраняют порядок вставки, но полагаться на это как на основной механизм не всегда стоит.

    Вложенные структуры

    Структуры данных можно вкладывать друг в друга. Это позволяет создавать сложные модели реального мира. Например, список словарей:

    Заключение

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

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

    4. Функции и модули: организация кода и повторное использование

    Функции и модули: организация кода и повторное использование

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

    Представьте, что вы пишете программу для интернет-магазина. Вам нужно рассчитать налог на товар в корзине. Вы пишете формулу. Затем вам нужно рассчитать налог для стоимости доставки. Вы копируете формулу. Потом налог для скидочного купона. Снова копируете.

    А что, если налоговая ставка изменится? Вам придется искать и исправлять этот код в трех (или тридцати) разных местах. Это нарушает главный принцип программирования: DRY (Don't Repeat Yourself — Не повторяйся).

    Сегодня мы изучим инструменты, которые спасут вас от хаоса: функции и модули.

    Что такое функция?

    Функция — это именованный блок кода, который выполняет определенную задачу. Вы можете представить функцию как мини-программу внутри вашей основной программы. Вы «вызываете» её по имени, она делает свою работу и возвращает результат.

    Лучшая аналогия для функции — это кухонный комбайн или мясорубка.

    !Иллюстрация принципа работы функции: входные данные превращаются в результат.

    У функции есть:

  • Имя (чтобы мы могли к ней обратиться).
  • Аргументы (необязательно) — то, что мы кладем внутрь (мясо).
  • Тело функции — инструкции, что нужно сделать.
  • Возвращаемое значение (необязательно) — результат работы (фарш).
  • Создание функции

    В Python функции создаются с помощью ключевого слова def (от английского define — определить).

    Когда интерпретатор видит этот код, он просто запоминает: «Ага, если меня попросят выполнить say_hello, я должен вывести эти две строки». Сама по себе эта конструкция ничего не выводит на экран.

    Чтобы код заработал, функцию нужно вызвать:

    Аргументы функции

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

    Здесь name — это переменная, которая существует только внутри функции. Когда мы вызываем greet("Алекс"), строка "Алекс" попадает в переменную name, и функция использует её.

    Возвращаемое значение: return

    До сих пор наши функции просто печатали текст на экран. Но в реальном программировании функции чаще всего должны вычислять что-то и отдавать результат обратно, чтобы программа могла использовать его дальше.

    Для этого используется ключевое слово return.

    Рассмотрим пример из геометрии. Нам нужно вычислить площадь круга. Математическая формула выглядит так:

    Где: * — площадь круга (искомое значение). * — математическая константа (примерно 3.14159). * — радиус круга.

    Реализуем это в коде:

    > Важно: После выполнения команды return функция немедленно прекращает работу и выходит. Любой код, написанный после return внутри функции, никогда не выполнится.

    В чем разница между print и return?

    Это самый частый вопрос новичков. * print() — это крикнуть ответ в громкоговоритель. Все услышали, но записать и использовать в дальнейших расчетах это нельзя. * return — это написать ответ на бумажке и передать её тому, кто задал вопрос. Эту бумажку можно положить в карман (переменную) и использовать позже.

    Аргументы: позиционные и именованные

    Представьте функцию, которая рассчитывает стоимость поездки на такси:

    Позиционные аргументы

    Python ориентируется на порядок. Первое число попадет в distance, второе — в rate, третье — в discount.

    Если перепутать местами (например, taxi_price(20, 10, 50)), расчет будет неверным.

    Именованные аргументы

    Чтобы не запутаться, можно указывать имена аргументов явно:

    В этом случае порядок не важен.

    Значения по умолчанию

    Часто некоторые параметры бывают стандартными. Например, скидка обычно равна 0. Мы можем указать это сразу при создании функции.

    Область видимости (Scope)

    Переменные, созданные внутри функции, называются локальными. Они невидимы для остальной программы. Это как правило «Всё, что происходит в Вегасе, остается в Вегасе».

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

    Модули: разделяй и властвуй

    Когда кода становится очень много (тысячи строк), держать его в одном файле неудобно. Прокрутка файла превращается в мучение.

    Python позволяет разбивать программу на несколько файлов. Каждый файл с кодом на Python (.py) называется модулем.

    Представьте, что вы создали файл math_utils.py и написали туда свои функции для расчетов.

    Теперь в основном файле main.py вы можете подключить их:

    Стандартная библиотека

    Вместе с Python устанавливается огромный набор готовых модулей. Это называется «Батарейки в комплекте» (Batteries Included). Вам не нужно писать функцию для извлечения квадратного корня или генерации случайного числа — они уже написаны профессионалами.

    Примеры полезных модулей:

    * math — сложные математические операции. * random — генерация случайных чисел. * datetime — работа с датой и временем. * os — работа с файловой системой компьютера.

    Пример использования модуля random:

    Импорт конкретных функций

    Если вам не нужен весь модуль, а только одна функция, можно импортировать только её:

    Обратите внимание: в этом случае нам не нужно писать название модуля перед функцией (не math.sqrt, а просто sqrt).

    Заключение

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

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

    5. Основы объектно-ориентированного программирования и работа с файлами

    Основы объектно-ориентированного программирования и работа с файлами

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

    Данные начинают «разбредаться» по всей программе, и становится трудно уследить, какая функция за какие переменные отвечает. Здесь на сцену выходит Объектно-Ориентированное Программирование (ООП). Это парадигма, которая позволяет моделировать реальный мир в коде, объединяя данные и поведение в единые сущности — объекты.

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

    Что такое ООП? Классы и Объекты

    В центре ООП стоят два понятия: Класс и Объект.

    Чтобы понять разницу, представьте, что вы инженер на заводе по производству роботов.

  • Класс — это чертеж, схема или инструкция. В чертеже написано: «Робот должен иметь две руки, две ноги, серийный номер и уметь ходить». Сам чертеж ходить не умеет, это просто бумага.
  • Объект (или экземпляр класса) — это конкретный робот, собранный по этому чертежу. У него есть конкретный серийный номер (например, R2-D2), и он физически может ходить.
  • !Иллюстрация различия между абстрактным классом (чертежом) и конкретными объектами (реализациями).

    Создание первого класса

    В Python классы создаются с помощью ключевого слова class. Имена классов принято писать с большой буквы (стиль CamelCase).

    Мы создали простейший класс Cat. Пока он пустой (оператор pass ничего не делает, но нужен для синтаксиса). Теперь создадим объекты этого класса:

    Атрибуты и метод __init__

    Коты должны чем-то отличаться друг от друга. У них есть характеристики: имя, цвет, возраст. В ООП эти переменные внутри объекта называются атрибутами (или полями).

    Чтобы задать атрибуты при создании объекта, используется специальный метод __init__. Это конструктор класса. Он запускается автоматически в момент создания нового объекта.

    Загадочный self

    Вы наверняка заметили слово self. Это ссылка на текущий объект.

    Когда мы пишем self.name = name, мы говорим компьютеру: «Возьми значение переменной name, которое нам передали, и сохрани его внутрь этого конкретного кота».

    Без self переменная name была бы просто временной переменной внутри функции, которая исчезла бы сразу после завершения работы конструктора.

    Методы: поведение объектов

    Коты не только имеют цвет, они умеют что-то делать: мяукать, спать, есть. Функции внутри класса называются методами.

    Обратите внимание: при вызове метода my_cat.meow() мы не передаем аргументов, хотя в определении написано def meow(self). Python автоматически передает сам объект my_cat в качестве аргумента self.

    Практический пример: Геометрическая точка

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

    Расстояние между двумя точками и вычисляется по формуле Евклидова расстояния:

    Где: * — искомое расстояние (distance). * — координаты первой точки. * — координаты второй точки. * — операция извлечения квадратного корня.

    Реализуем это в коде:

    Наследование: не повторяй себя

    Один из главных принципов ООП — Наследование. Представьте, что у нас есть класс Animal (Животное). У всех животных есть имя и возраст. Зачем писать это заново для Cat (Кошка) и Dog (Собака)?

    Мы можем сказать, что Кошка наследуется от Животного.

    Это позволяет писать код один раз и переиспользовать его многократно.

    Работа с файлами

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

    Чтение файлов

    Для открытия файла используется встроенная функция open(). У неё есть два основных аргумента: имя файла и режим работы.

    Основные режимы: * 'r' (read) — только чтение (по умолчанию). * 'w' (write) — запись (если файл существовал, он будет стерт!). * 'a' (append) — дозапись (добавление данных в конец файла).

    Почему этот способ плохой? Если во время чтения произойдет ошибка, программа «упадет», и строка file.close() не выполнится. Файл останется «зависшим» в памяти, что может привести к проблемам.

    Контекстный менеджер with

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

    Методы чтения

  • read() — читает весь файл целиком в одну строку.
  • readline() — читает одну строку за раз.
  • readlines() — читает все строки и возвращает их в виде списка.
  • Запись в файл

    Давайте запишем список наших покупок в файл.

    Если мы запустим этот код, в папке с программой появится файл shop.txt. Если запустить код еще раз с другими товарами, старый файл будет полностью перезаписан. Если вы хотите добавить товары к существующему списку, используйте режим 'a'.

    Объединяем ООП и файлы

    Давайте создадим класс Logger, который будет записывать сообщения о работе программы в файл. Это классическая задача для программиста.

    Теперь у нас есть объект my_logger, который скрывает внутри себя всю сложность работы с файлами и временем. В основной программе мы просто вызываем метод .log(), не думая о том, как именно это происходит. Это и есть сила инкапсуляции в ООП.

    Заключение

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

    Объектно-ориентированное программирование — это обширная тема. Мы коснулись лишь верхушки айсберга, но понимание классов, объектов, атрибутов и методов — это фундамент, на котором строятся все современные приложения на Python.

    В следующих уроках мы будем использовать эти знания для создания более сложных и полезных проектов.