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

Python

Ресурсы

Задания (весна 2022)

  1. На основе блокнота «Метод Гаусса решения СЛАУ» реализовать метод Гаусса решения СЛАУ с использованием векторных возможностей numpy или без. Программный код для проверки в блокноте уже есть.

  2. Сделать модуль или пакет из одной из своих уже решённых задач. В будущем рекомендуется использовать его в веб-приложении и в приложении с GUI.

  3. Вдохновляясь примером «Компиляция Python разными способами», инсталлируйте Cython (требует компилятора C или MyPy (не требует), скомпилируйте свой модуль, и проверьте, что он импортируется. Не забудьте про аннотации типов. Выполняя это задание также выложите бинарник (.pyd под Windows или .so в Unix-подобных системах) в репозиторий (вообще обычно так стараются не делать, но в данном случае можно).

  4. Подумать: а как мы будем считать давление в нашем реальном газе?

  5. ⚛️Взять любые свои экспериментальные данные с и проверить при помощи критерия Колмогорова-Смирнова (используя Scipy и Pandas), соответствуют ли они ожидаемому распределению. Данные к решению приложить.

  6. 🧬Основываясь на примерах, полученных знаниях, технической эрудиции и смекалке, реализовать любую несложную программу с GUI (желательно PyQT5), возможно сделав графический интерфейс для одной из своих предыдущих программ.

  7. 🧬Вычислить какой-либо определённый интеграл, пользуясь методом Монте-Карло. Повысить точность при помощи multiprocessing или аналогичного средства.

  8. 🧬Ускорить при помощи компиляции (любым из способов, включая numba) любую свою программу. Метод Монте-Карло — хороший кандидат.

  9. Гуманитарное задание Написать от нескольких предложений до нескольких абзацев своих мыслей касательно этого текста (можно по-русски 🙂). Положить в текстовый файл и выставить у себя в репозитории. [задание для всех, но для биоинформатиков чуть позже].

  10. Реализовать веб-приложение, отталкиваясь от предоставленного примера. Можно реализовать веб-интерфейс к какому-нибудь своему приложению. [задание для всех, но для биоинформатиков чуть позже].

  11. 🧬Скачать где угодно или попросить у физиков (=)) любые экспериментальные данные с известным ожидаемым распределением и проверить при помощи критерия Колмогорова-Смирнова (используя Scipy и Pandas), соответствуют ли они ожидаемому распределению. Данные к решению приложить. В качестве варианта — можно решить вместе со следующим заданием, см. курсив ниже.

  12. 🧬⚛️Попробовать при помощи любого фреймворка генетического программирования (примеры см. тут блокноты с примерами) найти субоптимальное решения любой задачи. Можно требующей перебора, можно ещё какой-нибудь. В качестве варианта — можно решить с предыдущим заданием — подобрать значения случайной величины, чтобы критерий Колмогорова-Смирнова классифицировал их, как распределённые нужным вам образом.

  13. ⚛️Базы данных: написать любую интерактивную (консоль, GUI или Web) программу, которая позволила бы редактировать данные в БД. БД можно взять с данными о студентах из лекции. К примеру, можно при помощи программы ставить студентам оценки.

  14. Репозиторий-конфетка. Убрать всякий ненужный мусор типа __pycache__, именование исходников на Питоне сделать, как предписывает PEP 8, в виде snake_case.py и без всяких экзотических символов, если используете какую-то свою систему именования файлов — сделать всё в соответствии с ней.

  15. 🧬Нейрокартинка. Взять один из двух блокнотов — локальный или Google Colab, модифицировать условие в верхней части на попадание точки в фигуру и обучить нейронную сеть другой фигуре. Для сложных фигур можно изменить количество нейронов в скрытом слое.

Выполненные задания

В таблице ниже лишь сводка, комментарии открывать по ссылке в таблице.

Основы программирования (Python), осень 2018
АУ: Python биоинформатики, 2021-2022

Ресурсы — слайды, листинги, блокноты

Перечисленные блокноты также доступны в режиме предпросмотра GitHub (с некоторыми ошибками, но GiHub умеет их показывать).

  1. Слайды: Python: что это, откуда и зачем

  2. Блокнот: Ответы на вопросы ознакомительного теста

  3. Слайды: Немного практики

  4. Блокнот: Основы

  5. Блокнот: Ряд Тейлора

  6. Блокнот: Кунг фу графиков, поверхностей и гистограмм

  7. Блокнот: Гаубица Д-30 и «Катюша»

  8. Примеры на черепашью графику — капуста, борщевик, а также летящие тела с управлением

  9. Слайды: Статический анализ, анализ типов, модульные тесты

  10. Блокнот: Задача N тел и второй закон Кеплера

  11. Блокнот: Определяем свои пространства

  12. Блокнот: Простые задачки для хорошего настроения

  13. Блокнот: Срезы, итераторы и генераторы

  14. Блокнот: Метод Гаусса решения СЛАУ

  15. Блокнот: Just-in-Time компиляция (с numba ничего не заработало? Ладно, можно использовать Google Collab)

  16. Пример: Модуль и пакет

  17. Пример: Компиляция Python разными способами

  18. 🧬Слайды: Параллельное программирование: потоки, процессы, сопрограммы, циклы обработки сообщений и примеры

  19. ⚛️Блокнот: Немного данных и статистики

  20. 🧬Примеры: Декларативный GUI; Множественное наследование

  21. Пример: Простое Web-приложение

  22. Блокнот: Немного данных и статистики

  23. Блокноты: Реляционные БД и ORM

  24. Слайды: Эволюционные алгоритмы и блокноты с примерами

— Вы находитесь здесь —

  1. Слайды: Классификаторы — простейший линейный и на базе нейронной сети

  2. Блокноты: Примеры нейронных сетей

Задания для зачёта

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

Весна 2022

  1. В программе на Python или в блокноте на своём компьютере продемонстрировать определение операций для своего класса при помощи magic-методов.

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

  3. Создать модуль и пакет на Python, импортировать в свою программу.

  4. При помощи numpy самостоятельно реализовать вычисление определителя любым способом. Можно пользоваться вырезками, оперируя при помощи них подматрицами.

  5. ⚛️Продемонстрировать SQL-инъекцию на простой БД.
    🧬На простом GUI-приложении продемонстрировать "подвисание" GUI во время вычислений.

  6. Пользуясь любыми известными формулами, написать функцию, которая возвращает комплексные корни кубического уравнения по его коэффициентам.

  7. Реализовать, включая нормирование матрицы для обеспечения сходимости, решение СЛАУ методом итерации.

  8. Написать функцию integrate(f, a, b), получающую параметры f - функцию от одной переменой и вещественные числа a и b, и вычисляющую определённый интеграл f на промежутке [a, b] методом прямоугольников, трапеций или любым другим аналогичным.

  9. Написать функцию diff(f), получающую параметры f - функцию от одной переменой, и возвращающую функцию, являющуюся производной (приближённо, методом конечных разностей) от f по её аргументу.

  10. Написать функцию или сопроцедуру (генератор) perms(n), выдающую полный набор кортежей, являющихся перестановками чисел от 1 до n. Например, perms(3) должна выдать [(3, 2, 1), (2, 3, 1), (2, 1, 3), (3, 1, 2), (1, 3, 2), (1, 2, 3)]. Алгоритм и порядок выдачи любые.

Осень 2021

  1. Любым способом на своём компьютере создать программу на Python, запустить её при помощи командной оболочки.

  2. Клонировать свой репозиторий локально; не пользуясь сайтом GitHub, добавить в него файл, зафиксировать изменения; отправить изменения на GitHub; продемонстрировать полученный файл на сайте.

  3. Клонировать свой репозиторий локально; не пользуясь сайтом GitHub, переименовать и удалить файл(ы), зафиксировать изменения; отправить изменения на GitHub; продемонстрировать полученный файл на сайте.

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

  5. В программе на Python или в блокноте на своём компьютере продемонстрировать циклы for и while; продемонстрировать работу с объектами range.

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

  7. В программе на Python или в блокноте на своём компьютере продемонстрировать работу со списками —индексирование, добавление, удаление элемента, вырезку.

  8. В программе на Python или в блокноте на своём компьютере продемонстрировать рисование графиков функций и параметрических графиков при помощи matplotlib.

  9. В программе на Python или в блокноте на своём компьютере продемонстрировать определение операций для своего класса при помощи magic-методов.

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

Чеклист перед сдачей заданий

Для автоматической проверки потребуется python -m pip install pylint nbqa. Если после установки инструменты не запускаются, пытаемся заменить pylint на python3 -m pylint и т.д.

  1. Запустить (как минимум, в программе нет синтаксических ошибок)

  2. В зависимости от того, программа или блокнот

    • Программа

      1. Проверить, что программа запускается и работает

      2. Проверить, что PyLint
        pylint --disable=no-member,c-extension-no-member,missing-docstring,invalid-name my_program.py
        ставит балл не менее 5.0

      3. Проверить, что файл .py назван по принципу snake_case.py

    • Блокнот

      1. Kernel → Restart kernel and run all cells, и затем проверить, что весь блокнот запускается и работает

      2. Проверить, что NBQA + PyLint
        nbqa pylint --disable=no-member,c-extension-no-member,missing-docstring,invalid-name,wrong-import-position my_notebook.ipynb
        ставит балл не менее 5.0. Тут добавляется послабление wrong-import-position, поскольку для блокнотов требовать все импорты в начале выглядят не очень адекватно.

      3. Проверить, что файл не назван Untitled.ipynb или .... (1).ipynb и т.д.

  3. Перепроверить, что программа делает то, что подразумевалось автором

  4. Перепроверить, что программа делает то, что подразумевалось преподавателем

Лайфхаки

  • Общие для всех ситуаций опции PyLint удобно не указывать каждый раз, а запомнить их в настройках, как написано здесь. Для Windows: pylint --disable=no-member,c-extension-no-member,missing-docstring,invalid-name --generate-rcfile >%HOMEPATH%\.pylintrc

  • Если не уверены в своём вкусе, можно воспользоваться инструментом autopep8, он по крайней мере отформатирует ваш код красиво

Задания (осень 2021)

0. Инсталлировать программное обеспечение из списка ниже

  1. Регистрация, создание репозитория, подключение к Discord

    • До 13.09 зарегистрировать аккаунт на GitHub (или GitLab, или BitBucket, или ещё что найдёте), создать репозиторий и заполнить форму

    • До 13.09 зарегистрироваться в Discord, зайти в чатик, поставить себе там ник в виде фамилии, имени [отчества], со всеми радостно поздороваться

  2. Первая программа — на основе этой — прокомментировать (комментарий — от # до конца строки) каждую строку, которую можно, рекомендуется модифицировать функцию

  3. Публикация кода на GitHub в своём репозитории

    • 29.09.2021 мы не успели посмотреть, как пользоваться Git и GitHub. Минимум есть на слайде, но его явно маловато. Поэтому дедлайн такой далёкий. Но кто чувствует в себе силы — можно сделать самостоятельно.

  4. Сделать блокнот, в котором будет выполняться вычисление функции при помощи частичной суммы ряда Тейлора и проверку того, как ведёт себя график получившейся функции. За основу можно взять этот блокнот

  5. Пользуясь блокнотом Гаубица Д-30 и «Катюша», допрограммировать физическую модель реактивного снаряда (а можно нафантазировать и ещё что-нибудь похитрее).

  6. По жалению вдохновляясь примерами с капустой и борщевиком, нарисовать свой фрактал при помощи черепашьей графики.

  7. Реализовать алгоритм Рабина-Карпа поиска вхождений образца в строку таким образом, чтобы он проходил тесты: дописать содержательную часть тела функции в этом примере.

  8. Пользуясь для вдохновения блокнотом Функции, декораторы, статическая типизация, Lint, сделать, как в нём предлагается, «декоратор с параметром», который из функции делает функцию, применяющуюся заданное количество раз к её же результату.

  9. На основе блокнота «Задача N тел и второй закон Кеплера» сделать класс Universe2D по аналогии с Universe3D, промоделировать движение небесных тел. Желающие могут сделать вектора и всю динамику действительно трёхмерными, но для этого лучше будет сделать отдельную программу, а не блокнот, чтобы matplotlib позволял «крутить» нарисованные орбиты.

  10. На основе блокнота «Задача N тел и второй закон Кеплера» для случая Universe3D численно проверить приблизительное выполнение второго закона Кеплера.

  11. Помедитировать над блокнотом про свои пространства и реализацией многочлена, придумать своё пространство (можно из тех примеров, которые перечислены), желательно кольцо, поле или алгебру, чтобы операций было побольше, реализовать и продемонстрировать операции над ним

  12. Реализовать алгоритм Евклида.

  13. Реализовать расширенный алгоритм Евклида (линейное разложение).

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

  15. На основании последнего примера (class Fib6) из блокнота «Срезы, итераторы и генераторы» сделать свой класс, объекты которого могут бесконечно выдавать числа Фибоначчи, значения факториала или элементы другой последовательности, чтобы по нему можно было «бегать» циклом for. Про «бесконечно выдавать» — важно, в этом и была идея! Ограничить-то вывод всегда можно через itertools.islice(my_fibs, 300), например.

Программное обеспечение

Программное обеспечение для Windows устанавливается с официальных сайтов, для Unix-подобных систем — при помощи системного менеджера пакетов.

  • Python 3.10+ (или 3.9+) https://www.python.org/downloads/, очень желательно 64-битный

    • Для Windows:

      • говорим, что хотим изменить настройки

      • ставим галочку на тему того, что надо внести Python в системные пути

      • настройки можно оставить по умолчанию

  • Пакеты для Python — либо при помощи системного пакетного менеджера, либо (например, для Windows) при помощи менеджера Python:

    • Обновление пакетного менеджера (необязательно) python -m pip install --upgrade pip

      • Если не получлось, то попробовать python -m ensurepip и повторить

    • Инсталляция пакетов python -m pip install ipython scipy numpy pandas jupyterlab matplotlib

      • В дальнейшем, если возникнет желание, можно все установленные пакеты обновлять вот таким способом

  • Git

  • Не вредно — IDE. Популярные варианты:

    • Для маленьких программ (наш случай) — любой текстовый редактор + командная строка или совсем простая среда IDLE (под Windows инсталлируется вместе с Python)

    • Для средних программ (тоже наш случай) или «средни» ПК — Visual Studio Code + плагин для Python

    • Для крупных проектов и мощных ПК — JetBrains PyCharm, при наличии Email в домене университета — Professional Edition

Удобный файловый менеджер, позволяющий быстро бегать по файловой системе и редактировать текстовые файлы, например (но не обязательно) двухпанельные Far Manager или Midnight Commander — научиться пользоваться без мышки

  • Любой современный веб-браузер

Содержание курса

Язык программирования Python

  1. История и предназанчение языка, основные свойстваю.

  2. Оболочки Python, IPython, Jupyter Notebook, Jupyter Lab. Система контроля версий Git, основные операции.

  3. Встроенные типы данных языка, операции над ними.

  4. Модули стандартной и внешней библиотек.

  5. Функции. Встроенная документация. Передача параметров, рекурсивные функции. Продвинутая тема — декораторы.

  6. Пользовательские типы данных. Описание классов.

  7. Реализация стандартных операций над пользовательскимим типами. Операции, вызываемые встроенными функциями и операторами.

  8. Реализация собственных модулей.

  9. Промежуточная консультация.

  10. Немного ускоримся: Numba, PyPy, Cython

  11. Работа с массивами данных: чтение/запись CSV, HDF5.

  12. Анализ массивов данных: библиотека Pandas.

  13. Сопроцедуры. AsyncIO — пример того, как Python очень не хочет быть функциональным.

  14. Веб-приложения. Фреймворки для веб-приложений.

  15. Параллельное и распределённое программирование.

Источники

Литература

  1. Mark Lutz. Learning Python, 5th Edition // O'Reilly Media, 2013, 1648 p.

  2. R. Sedgewick, K. Wayne, R. Dondero. Introduction to Programming in Python: An Interdisciplinary Approach // Addison-Wesley Professional, 2015, 792 p.

  3. [перевод предыдущей книги] Роберт Седжвик, Кевин Уэйн, Роберт Дондеро. Программирование на языке Python. Учебный курс / пер. с англ. — СПб.: ООО "Альфа-книга" // М.: Диалектика, 2017, 736 с.

  4. Брайсон Пэйн. Python для детей и родителей. Играй и программируй / пер. с англ. М.А. Райтман // М.: Издательство «Э», 2017. — 352 с. [книжку можно почитать с Google Books]

  5. Сегаран. Т. Программируем коллективный разум. / пер. с англ. – СПб: Символ-Плюс, 2008. – 368 с.

  6. Дейт К. Дж. Введение в системы баз данных / пер. с англ. Introduction to Database Systems. — 8-е изд. — М.: Вильямс, 2005. — 1328 с.

Не литература

Отдельные лекции, комментарии, важные реплики и прочие материалы