Краткий конспект лекций
Лекция 1. Установочная встреча.
Знакомство с преподавателем. Общая структура курса. Формирование итоговой оценки. Основные идеи, закладываемые в курс. Место курса в образовательной программе.
Лекция 2. Краткий обзор преимуществ и недостатков языка.
Создатель языка Python. Историческая
перспектива на версии языка. Семантическое версионирование. Области
использования языка. Сильные стороны языка, его основной недостаток.
Интерпретируемость как один из источников замедления работы по сравнению с
компилируемыми языками. Механика присваивания с точки зрения памяти. Переменные как имена.
Автоматический сбор мусора как один из источников замедления работы программы.
Типы int и float. Способы создания:
литералы и вызов типа.
Переменная как ссылка в памяти. Объект в памяти: значение, тип,
количество ссылок. Неизменяемость. Операции над числами. Краткая запись.
Отличия различных способов деления. Явное и неявное приведение.
Лекция 3. Строки: неизменяемые последовательности.
Последовательности в Python: str, list и tuple. Ключевые
свойства последовательностей. Индексируемость. Срезы: особенности
использования, синтаксиса. Срезы как способ копирования
последовательностей. Итерируемость. Варианты обхода последовательности:
по элементам, по индексам (range), одновременно по индексам и
значениям (enumerate). Взятие длины последовательности. Проверка на
вхождение. Получение минимального и максимального элементов. Подсчет
количества вхождений элемента. Получение индекса первого вхождения
элемента по его значению. Строковые методы. Особенности использования
методов split, join.
Лекция 4. Основы создания алгоритмического решения.
Анализ задачи. Формирование идей решения. Выбор метода решения. Выбор инструментов: типов данных и их свойств, типов циклов, условий остановки. Реализация для частного случая. Отладка решения. Реализация для общего случая. Определение узких мест с точки зрения количества вычислительных операций. Рефакторинг. Сравнение с альтернативными решениями. Свойства алгоритма: сложность, понятность.
Лекция 5. Списки. Кортежи. Множества.
Списки как изменяемые последовательности. Списочные выражения.
Демонстрация изменяемости через добавление, удаление и обновление.
Различные способы добавления новых элементов: append, extend и insert. Различные
способы удаления элементов: remove, pop и del.
Ловушка разделяемых ссылок. Виды копирования: поверхностное и глубокое.
Срезы как способ поверхностного копирования
последовательностей. Модуль copy и его основные функции: copy и deepcopy.
Способы создания кортежей. Структурная неизменяемость кортежей. Основные
преимущества от использования кортежей. Способы создания множеств. Основные операции на множествах.
Лекция 6. Словари.
Способы создания словарей. Разница в поведении оператора квадратные
скобки при извлечении значений в словаре и списке. Изменяемость
словарей. Добавление новых элементов в словарь. Удаление элементов из
словаря. Изменение существующих элементов. Уникальность ключей.
Требования к ключам словаря. Итерирование по ключам, значениям и парам,
хранящимся в словаре. Проверка на вхождение ключа с помощью оператора
in. Получение размера словаря с помощью len().
Лекция 7. Функции.
Объявление функции с помощью def. Требования и рекомендации к
именованию функций. Аргументы функции: позиционные и именованные.
Опциональные подсказки типов в описании аргументов и возвращаемых
значений. Вызов функции и её объявление. Возврат результатов функции с
помощью return. Возврат и обработка нескольких значений.
Сопоставление аргументов при вызове функции: позиционное и по имени.
Произвольное количество аргументов функции при помощи *args и
**kwargs.
Лекция 8. Введение в ООП
Класс как пользовательский
тип. Класс как совокупность свойств и поведения. Синтаксис создания
классов. Объект self. Создание атрибутов экземпляров. Роль метода
__init__. Доступ к атрибутам и методам экземпляра внутри контекста
класса и за его пределами.
Лекция 9. Введение в ООП II
Парадигмы программирования как способ борьбы с возрастающей сложностью программного обеспечения. Состояние и поведение как ключевые факторы программ, требующие управления. Императивно-процедурное программирование. Функциональное программирование. Объектно-ориентированное программирование. Класс как совокупность свойств и поведения. Создание экземпляров классов: без поведения и без состояния, с поведением и без состояния, с поведением и с состоянием. Изменяемость пользовательского типа. Интуитивное понятие интерфейса в объектах окружающего мира. Интерфейс как способ управления сложностью. Интерфейс функции. Интерфейс класса.
Лекция 10. Инкапсуляция. Наследование.
Инкапсуляция как принцип объединения методов и свойств во внутреннем состоянии объекта. Сокрытие данных как основное свойство инкапсуляции. Наследование как способ избежать дублирования кода на уровне классов. Диаграмма классов UML для формального описания создаваемых абстракций. Создание иерархии наследования. Отличия в наследовании атрибутов и методов.
Лекция 11. Наследование II. Полиморфизм. Протоколы.
Особенности наследования атрибутов в зависимости от
уровня доступа. super() для обращения к родительскому классу. Общий родитель object.
Множественное наследование.
Проблема ромба. __mro__ в Python для решения проблемы ромба. Полиморфизм в окружающем мире и
в программах на Python. Полиморфность объектов, находящихся в
отношении наследования. Перегрузка методов классов для реализации различного поведения.
Протоколы языка Python. Перегрузка приведения к строке через __str__,
получения количества элементов __len__, приведения к булеву типу __bool__ и др.
Лекция 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. Связь локальной области видимости и функций. Необходимые предпосылки для возникновения объемлющей области видимости. Связь глобальной области видимости и модулей. Опасности в переопределении объектов из встроенной области видимости и почему переопределение работает. Изменение глобальных переменных из функций. Изменение объектов из объемлющей области видимости.
Лекция 14. Функции II.
Мемоизация как способ кеширования результатов вычислений. Роль объемлющей области видимости в построении мемоизации. Декоратор: интерфейс, типовая структура, особенности использования. Типовые задачи, решаемые с помощью декораторов. Декоратор с параметром: интерфейс, типовая структура, особенности использования. Эквивалентная запись без использования символа “@”. Опциональные подсказки типов в описании аргументов и возвращаемых значений.
Лекция 15. Принципы SOLID.
Принципы программирования DRY, KISS. Связь принципов SOLID и ООП. Принцип единственной ответственности (single responsibility principle). Принцип открытости/закрытости (open-closed principle). Принцип подстановки Лисков (Liskov substitution principle). Принцип разделения интерфейса (interface segregation principle). Принцип инверсии зависимостей (dependency inversion principle).