.. _lectures-content-label-2024: Краткий конспект лекций ======================= Лекция 1. Установочная встреча. ------------------------------- Знакомство с преподавателем. Общая структура курса. Формирование итоговой оценки. Основные идеи, закладываемые в курс. Место курса в образовательной программе. Лекция 2. Краткий обзор преимуществ и недостатков языка. -------------------------------------------------------- Создатель языка Python. Историческая перспектива на версии языка. Семантическое версионирование. Области использования языка. Сильные стороны языка, его основной недостаток. Существующие подходы к ускорению программ на Python. Как выполняется программа на Python. Байт-код, машинный код. Компиляция и интерпретация. Интерпретируемость как один из источников замедления работы по сравнению с компилируемыми языками. Механика присваивания с точки зрения памяти. Переменные как имена. Автоматический сбор мусора как один из источников замедления работы программы. Типы ``int`` и ``float``. Способы создания: литералы и вызов типа. Переменная как ссылка в памяти. Объект в памяти: значение, тип, количество ссылок. Неизменяемость. Операции над числами. Краткая запись. Отличия различных способов деления. Явное и неявное приведение. Лекция 3. Строки: неизменяемые последовательности. -------------------------------------------------- Последовательности в ``Python``: ``str``, ``list`` и ``tuple``. Ключевые свойства последовательностей. Индексируемость. Срезы: особенности использования, синтаксиса. Срезы как способ копирования последовательностей. Итерируемость. Варианты обхода последовательности: по элементам, по индексам (``range``), одновременно по индексам и значениям (``enumerate``). Взятие длины последовательности. Проверка на вхождение. Получение минимального и максимального элементов. Подсчет количества вхождений элемента. Получение индекса первого вхождения элемента по его значению. Строковые методы. Особенности использования методов ``split``, ``join``. Форматирование строк с помощью ``f-string``. Лекция 4. Списки. ----------------- Списки как изменяемые последовательности. Списочные выражения. Демонстрация изменяемости через добавление, удаление и обновление. Различные способы добавления новых элементов: ``append``, ``extend`` и ``insert``. Различные способы удаления элементов: ``remove``, ``pop`` и ``del``. Ловушка разделяемых ссылок. Виды копирования: поверхностное и глубокое. Срезы как способ поверхностного копирования последовательностей. Модуль ``copy`` и его основные функции: ``copy`` и ``deepcopy``. Лекция 5. Словари. ------------------ Способы создания словарей. Разница в поведении оператора квадратные скобки при извлечении значений в словаре и списке. Изменяемость словарей. Добавление новых элементов в словарь. Удаление элементов из словаря. Изменение существующих элементов. Уникальность ключей. Требования к ключам словаря. Итерирование по ключам, значениям и парам, хранящимся в словаре. Проверка на вхождение ключа с помощью оператора ``in``. Получение размера словаря с помощью ``len()``. Лекция 6. Функции. ------------------ Объявление функции с помощью ``def``. Требования и рекомендации к именованию функций. Аргументы функции: позиционные и именованные. Опциональные подсказки типов в описании аргументов и возвращаемых значений. Вызов функции и её объявление. Возврат результатов функции с помощью ``return``. Возврат и обработка нескольких значений. Сопоставление аргументов при вызове функции: позиционное и по имени. Произвольное количество аргументов функции при помощи ``*args`` и ``**kwargs``. Лекция 7. Введение в ООП. Класс как пользовательский тип. --------------------------------------------------------- Парадигмы программирования как способ борьбы с возрастающей сложностью программного обеспечения. Состояние и поведение как ключевые факторы программ, требующие управления. Императивно-процедурное программирование. Функциональное программирование. Объектно-ориентированное программирование. Класс как пользовательский тип. Класс как совокупность свойств и поведения. Синтаксис создания классов. Объект ``self``. Создание атрибутов экземпляров. Роль метода ``__init__``. Доступ к атрибутам и методам экземпляра внутри контекста класса и за его пределами. Лекция 8. Инкапсуляция. ----------------------- Создание экземпляров классов: без поведения и без состояния, с поведением и без состояния, с поведением и с состоянием. Изменяемость пользовательского типа. Интуитивное понятие интерфейса в объектах окружающего мира. Интерфейс как способ управления сложностью. Интерфейс функции. Интерфейс класса. Инкапсуляция как принцип объединения методов и свойств во внутреннем состоянии объекта. Сокрытие данных как основное свойство инкапсуляции. Соотношение понятий инкапсуляции и сокрытия данных. Механика реализации сокрытия данных в Python: ``protected`` и ``private`` поля и методы. Доступ к защищённым и приватным полям за пределами контекста класса. Лекция 9. Наследование. ------------------------ Наследование как способ избежать дублирования кода на уровне классов. Отличия в наследовании атрибутов и методов. Особенности наследования атрибутов в зависимости от уровня доступа. ``super()`` для обращения к родительскому классу. Множественное наследование. Проблема ромба. ``__mro__`` в Python для решения проблемы ромба. Диаграмма классов UML для формального описания создаваемых абстракций. Лекция 10. Наследование II. --------------------------- Особенности наследования атрибутов в зависимости от уровня доступа. ``super()`` для обращения к родительскому классу. Общий родитель ``object``. Множественное наследование. Проблема ромба. ``__mro__`` в Python для решения проблемы ромба. Лекция 11. Полиморфизм. --------------------------------- Полиморфизм в окружающем мире и в программах на Python. Полиморфность объектов, находящихся в отношении наследования. Перегрузка методов классов для реализации различного поведения. Протоколы языка Python. Перегрузка приведения к строке через ``__str__``, получения количества элементов ``__len__``, итерирования через ``__iter__`` и ``__next__``. Лекция 12. Исключения. ----------------------- Разбор сообщений об ошибках в терминале командой строки. Исключения как результат нестандартного поведения. Часто возникающие исключения. Иерархия наследования исключений в Python. Разница между ``BaseException`` и ``Exception``. Конструкция `try/except/else/finally`. Особенности использования ``except`` для обработки исключений в случае отсутствия явного типа исключения или использования в качестве ожидаемого класса-родителя группы исключений. Получение доступа к экземпляру исключения. Гарантированность вызова блока ``finally`` и мотивация для такого поведения. Стили работы с ошибками во время выполнения программы: `LBYL (look before you leap)` и `EAFP (easier to ask for forgiveness than permission)`. Сравнение подходов. Исключения как дополнительный канал обмена информацией. Поднятие и перехват исключений. Выбор между ``return`` и поднятием исключения. Лекция 13. Области видимости. ----------------------------- Четыре области видимости в Python. Правило LEGB. Связь локальной области видимости и функций. Необходимые предпосылки для возникновения объемлющей области видимости. Связь глобальной области видимости и модулей. Опасности в переопределении объектов из встроенной области видимости и почему переопределение работает. Изменение глобальных переменных из функций. Изменение объектов из объемлющей области видимости. Замыкание. Мемоизация как способ кеширования результатов вычислений.