Краткий конспект лекций
Лекция 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. Связь локальной области видимости и функций. Необходимые предпосылки для возникновения объемлющей области видимости. Связь глобальной области видимости и модулей. Опасности в переопределении объектов из встроенной области видимости и почему переопределение работает. Изменение глобальных переменных из функций. Изменение объектов из объемлющей области видимости. Замыкание. Мемоизация как способ кеширования результатов вычислений.