From 1d63952275bc308564a9fb8871b9d8a75e873220 Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Mon, 18 Aug 2025 19:18:41 +0300 Subject: [PATCH 01/14] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=D1=80=D0=BE=20(=D0=BA=D1=80=D0=BE=D0=BC?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=D0=B0=2020).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Выполнил все пункты из интро, кроме пункта 20, т.к. нет доступа к нему. --- log.ipynb | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 log.ipynb diff --git a/log.ipynb b/log.ipynb new file mode 100644 index 00000000..eeb0c519 --- /dev/null +++ b/log.ipynb @@ -0,0 +1,56 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "e837aceb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'intro 7.2'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"intro 7.2.\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "3a52e3c7", + "metadata": {}, + "source": [ + "18/08\n", + "\n", + "1. Прошёл intro (за исключением 20 пункта)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 44b80c5be00802095de51ab5756eca1195b929a1 Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Sat, 30 Aug 2025 22:40:20 +0300 Subject: [PATCH 02/14] [TASK] Quiz #6 (https://github.com/SENATOROVAI/intro-cs/issues/6) closes https://github.com/SENATOROVAI/intro-cs/issues/6 --- log.py | 20 ++++ quiz.ipynb | 337 +++++++++++++++++++++++++++++++++++++++++++++++++++++ quiz.py | 282 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 639 insertions(+) create mode 100644 log.py create mode 100644 quiz.ipynb create mode 100644 quiz.py diff --git a/log.py b/log.py new file mode 100644 index 00000000..3bb6aae9 --- /dev/null +++ b/log.py @@ -0,0 +1,20 @@ +"""intro.""" + +# 18/08/25 +# +# 1. Прошёл intro (за исключением 20 пункта). + +# 20/08/25 +# +# 1. Прошёл 9 модулей по курсу Python-разработчик с нуля. +# 2. Сделал половину quiz1 task6 + +# 29/08/25 +# +# 1. Прошёл 10-12 модулей по курсу Python-разработчик с нуля. +# 2. Сделал quiz1 task6 + +# 30/08/25 +# +# 1. Закончил курс Python-разработчик с нуля. +# 2. Сделал quiz2 task6 diff --git a/quiz.ipynb b/quiz.ipynb new file mode 100644 index 00000000..5b0713f3 --- /dev/null +++ b/quiz.ipynb @@ -0,0 +1,337 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "a0970523", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "\"\"\"intro.\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55493f5a", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# quiz1" + ] + }, + { + "cell_type": "markdown", + "id": "562dd714", + "metadata": {}, + "source": [ + "Список вопросов к видео https://youtu.be/hW_7hodGxVU?si=tCEVs00xGt2q61eW (АЛГОРИТМ ПРИНЯТИЯ И ОТДАЧИ ДОМАШКИ):\n", + " \n", + "(По желанию )В ответе подробно всё опишите и обязательно нужно указывать тайм код из видео где я это сказал, по желанию, дополнительно прикладываем скриншот из видео.\n", + "Если вы знаете ответы на вопросы из Вашего опыта, то таймкоды из видео не надо указывать и т.д.\n", + "\n", + "1) Как понять, что домашка пришла?\n", + "- Руслан тегает ученика и пишет 'прими пулл' (или пишет, что надо сделать) - таймкод 0:12\n", + "2) Как принять домашку?\n", + "- Зайти в GitHub Desktop, нажать Fetch origin, зайти в History и посмотреть последний коммит, открыть репозиторий в vscode/cursor - таймкод 0:20\n", + "3) Зачем нужна кнопка history и какие функции появляются при нажатии правой кнопки мыши на коммит?\n", + "- Кнопка history содержит историю коммитов. При нажатии на коммит появляются функции Reset to commit, Checkout commit, Reorder commit, Revert changes in commit, Create branch from commit, Create tag, Cherry-pick commit, Copy SHA, Copy tag, View on GitHub \n", + "\n", + "3.1) Где брать ссылку на коммит? куда её отправлять?\n", + "- Ссылка в github после нажатия на 'view on github', отправляем в чат ТГ HomeWork\n", + "4) Что такое файл лога? \n", + "- Файл с историей выполнения заданий, необходимо заполнять его проделанной работой после каждого урока\n", + "\n", + "4.1) Когда нужно его пушить?\n", + "- После выполнения ДЗ\n", + "5) Что такое интерпритатор? \n", + "- Программа, читающая и выполняющая код\n", + "6) Где можно выбрать интерпритатор?\n", + "- В окне Select Interpreter (можно открыть его, например, кликнув по текущему окружению в правом нижнем углу vscode)\n", + "7) Что такое модуль? \n", + "- файл, содержащий определения функций, классов, переменных и т.д.\n", + "8) Как создать и отправить коммит?\n", + "- в VScode это: Source control -> добавить changes в Stage -> написать commit message -> нажать Commit -> нажать Push\n", + "9) Как посмотреть что коммит точно отправлен и находится в github?\n", + "- нажать view in github\n", + "10) Какая команда показывает что код не прошёл проверки на ошибки? \n", + "- pre-commit run --all-files\n", + "\n", + "10.1) Напишите список линтеров которые используются для проверки кода и дайте их краткую характеристику.\n", + "- Pylint - всесторонний статический анализ кода, проверяет стиль, ошибки, качество\n", + "- Pydocstyle - проверяет соответствие докстринг стандартам (PEP 257)\n", + "- Flake8 - комбайн: проверяет стиль (PEP 8), сложность кода и логические ошибки\n", + "- Mypy - статическая проверка типов (type checking) для Python\n", + "- Black - автоматический форматтер кода, применяет единый стиль\n", + "11) Как узнать какой именно линтер не прошёл проверку?\n", + "- В выводе этот линтер будет помечен как Failed\n", + "12) Линтер Pylint видит markdown?\n", + "- Нет\n", + "13) Номер ячейки в терминале и номер ячейки в vs code может отличаться? в каком случае?\n", + "- Может, т.к. линтер не считает markdown за ячейку\n", + "14) Где посмотреть номер ячейки в vscode?\n", + "- в правом нижнем углу 'Cell ...'\n", + "15) В каком формате ipynb отправляется в гитхаб? причём здесь JSON?\n", + "- Файл .ipynb — это JSON-файл с особой структурой. Jupyter Notebook сохраняет всё содержимое (код, вывод, метаданные) в виде стандартного текстового JSON-формата. GitHub просто отображает этот JSON в удобном для чтения виде.\n", + "16) Где посмотреть в какой ячейке ошибка?\n", + "- либо в терминале после pre-commit, либо ошибка вывалится под самой ячейкой \n", + "17) Как запустить терминал?\n", + "- ctrl + ` или Terminal -> New Terminal\n", + "18) Что такое линтер?\n", + "- анализатор кода\n", + "19) В какой сайт нужно вставлять код ошибки если ошибка связана с pylint?\n", + "- https://pylint.readthedocs.io/en/stable/\n", + "20) Секция pydocstyle в большинстве случае автоматический закрывается после исправления ошибок в каком линтере?\n", + "- Pylint\n", + "21) Что такое описание модуля? Оно должно отражать информацию о том что находится в модуле?\n", + "- Да, должно вкратце отражать суть модуля\n", + "21) С какой git команды начинается утро программиста?\n", + "- git pull\n", + "22) После внесения изменений в файлах, кнопка open in vs code пропадает в кошке, как по другому открыть vs code из кошки?\n", + "- пкм по current repository -> open in vscode\n", + "23) Что такое stash? \n", + " - локальное временное хранилище незакомиченных изменений. Часто требуется для избежания \n", + "\n", + "23.1) Как сохранить стэш?\n", + " git командa(подсказка: https://t.me/c/1937296927/3602/19531): \n", + " - git stash save \"name\"\n", + " Кнопка в vs code:\n", + " - Source control -> Stashes -> Create Stash -> Enter\n", + "\n", + "23.2) Как восстановить стэш(подсказка: https://t.me/c/1937296927/3602/25747)?:\n", + "\n", + " git команда(подсказка: https://t.me/c/1937296927/3602/19531)?:\n", + " - GitHub -> Stashed Changes -> Restore\n", + "\n", + "23.3) Различие между стэшем и коммитом. \n", + " Когда лучше сохранить изменения в стэше, а когда коммитить.\n", + " - Стэш - чаще всего используется, когда надо временно локально сохранить недоделанную работу. Коммит - это уже подготовка к передаче кода вовне.\n", + "\n", + "23.4) Как просмотреть список сохраненных стэшей? \n", + " git команда (подсказка: https://t.me/c/1937296927/3602/19531):\n", + " - git stash list\n", + "\n", + "23.5) Как удалить стэш? \n", + " Команды для удаления отдельных стэшей или всех сразу.\n", + " git команда (подсказка: https://t.me/c/1937296927/3602/19531):\n", + " - git stash clear - удаляет все созданные\n", + " - git stash drop stash@{n} - удаляет конкретные\n", + "\n", + "23.6) Практические примеры использования стэша. \n", + " Краткие сценарии, где стэш помогает.\n", + "- Например, когда нужно срочно переключиться в другую ветку, но текущий код ещё не готов для коммита. Или когда происходит конфликт внесённых изменений. Или нужно обновить свою ветку, но нужно сохранит изменения, ещё не готовые к коммиту.\n", + "24) Где посмотреть что есть конфликт в файлах? \n", + "- Githud Desktop сообщит об этом при пулле изменений с сервера\n", + "\n", + "24.1) Когда он появляется?\n", + "- Когда разные разработчики вносят изменения в один и тот же файл и пытаются одновременно сохранить их\n", + "25) Как решить конфликт в файлах?\n", + "- Stash changes and continue -> выбрать последний коммит в истории и выбрать, чьи изменения в итоге оставить (внешние, локальные или оба)\n", + "26) Напишите правильное утверждение\n", + "- Зелёное то что пришло с гитхаба и синее локальные изменения\n", + "27) Если мы работаем в одном файле, можно ли принять pull после того как вы спрячете в стэш свои изменения? \n", + "- Да, можно\n", + "\n", + "27.1) Что может произойти когда stash восстановите после принятия pull?\n", + "- может произойти как автоматическое слияние (идеальный случай), так и конфликт, если правки в одних и тех же местах\n", + "28) Сколько способов решения конфликтов было показано в видео? Напишите ЧИСЛО и укажите их способы.\n", + "- 3: accept current change, accept incoming change, accept both changes\n", + "29) Что делает кнопка complete merge?\n", + "- Завершение слияния\n", + "30) В какой чат нужно писать если остались вопросы?\n", + "- HELP ME\n", + "31) Что такое FORK? Зачем его делают? \n", + "- Чтобы сделать независимую копию репозитория\n", + "32) Как скачать форкнутый репозиторий на локальный компьютер?\n", + "- Например, с помощью GitHub Desktop: Code -> Open with GitHub Desktop\n", + "33) С какой вероятностью ваши ошибки были уже решены? и кто их решил?\n", + "- С высокой вероятностью эти ошибки уже прорабатывались студентами ранее\n", + "34) Как создать файл в vs code?\n", + "- нажать New file в левом верхнем углу\n", + "35) Файл лога нужно заполнять в конце каждого урока?\n", + "- да\n", + "\n", + "==================\n", + "\n", + "Дополнительные вопросы:\n", + "1)Какая команда конвертирует файл в py из ipynb? \n", + "подсказка https://t.me/c/1937296927/1/26527 \n", + "- jupyter nbconvert --to script <имя_файла.ipynb>\n", + "\n", + "2) Что такое пакетный менеджер? Вы пользуетесь пакетным менеджером conda или pip? Какой лучше использовать для дата сайнс?\n", + "- Пакетный менеджер - программа-помощник для установки, обновления, удаления и отслеживания зависимостей в пакетах\n", + "- Использую pip, conda, poetry\n", + "- Для Data Science лучше использовать conda\n", + "\n", + "3) Почему расширение py лучше чем ipynb?\n", + "- Для ipynb необходима интерактивная среда\n", + "\n", + "4) Что такое pep8? \n", + "подсказка:https://peps.python.org/pep-0008/\n", + "- Рекомендации по написанию/оформлению кода \n", + "\n", + "4.1) линтеры проверяют на соблюдение pep8?\n", + "- Да\n", + "\n", + "4.2) Какая нотация используется для создания переменных? \n", + "\n", + "ответ на 85-95 страницы https://t.me/c/1937296927/1/16676\n", + "- snake_case\n", + "\n", + "4.3) Может ли переменная состоять из одной буквы например андерскор \"_\" ?\n", + "- Да\n", + "\n", + "4.4) Зачем и где мы используем андерскор _ \n", + "- Для игнорирования значений при распаковке, в именах переменных (leading, trailing, dunder, magic method), для улучшения читаемости чисел (1_000_000) \n", + "\n", + "4.5) По PEP8 допустима переменная в одну букву?\n", + "ответ на 85-95 страницы https://t.me/c/1937296927/1/16676\n", + "- PEP 8 не запрещает однобуквенные переменные, но даёт конкретные рекомендации, где их уместно использовать, чтобы не ухудшать читаемость кода (например, в циклах)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e8d34d69", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# quiz2" + ] + }, + { + "cell_type": "markdown", + "id": "7371631e", + "metadata": {}, + "source": [ + "Список вопросов к видео https://youtu.be/Si9MfV8uJ-0?si=JXHe-tsgOEwSTI5E (НАСТРОЙКА VSCODE, перенос строк, линтеры, работа с ячейками):\n", + "\n", + "(По желанию)В ответе подробно всё опишите и обязательно нужно указывать тайм код из видео где я это сказал, по желанию, дополнительно прикладываем скриншот из видео.\n", + "Если вы знаете ответы на вопросы из Вашего опыта, то таймкоды из видео не надо указывать и т.д.\n", + "\n", + "1. Как включить автосохранение данных в VSCODE?\n", + "- File -> Auto Save\n", + "2. Как настроить перенос строки? \n", + "- Preferences -> Settings -> wrap -> Word Wrap = on -> Word Wrap Column = 79\n", + "3. Сколько символов по pep8 разрешено на строке?\n", + "- 79\n", + "4. Какие способы переноса строк показаны в видео:\n", + "- Перенос с помощью разбиения строки по переменным, конкатенации, \n", + "\n", + "4.1 Строки с использованием обратного слэша (\\)\n", + "\n", + "string_continued = \"This is a long string that we want to \" \\\n", + " \"split across multiple lines.\"\n", + "print(string_continued)\n", + "- Обратный слэш склеивает следующую строку с предыдущей\n", + "\n", + "4.2 Тройные кавычки (''' или \"\"\") \n", + "\n", + "multi_line_string = \"\"\"This is a string that spans\n", + "multiple lines. You can write freely\n", + "and it will keep the line breaks.\"\"\"\n", + "print(multi_line_string)\n", + " - Позволяет писать многострочный текст с сохранением переносов\n", + "\n", + "4.3 Создание списка строк и объединение с помощью join\n", + "\n", + "strings = [\n", + " \"This is the first line.\",\n", + " \"This is the second line.\",\n", + " \"This is the third line.\"\n", + "]\n", + "result = \"\\n\".join(strings) # Используем перенос строк '\\n'\n", + "print(result)\n", + "- Метод join позволяет конкатенировать элементы массива\n", + "\n", + "4.4 Использование круглых скобок для продолжения строки\n", + "long_string = (\n", + " \"This is a very long string that I would like to \"\n", + " \"continue on the next line.\"\n", + ")\n", + "print(long_string)\n", + "- Перенос строк внутри скобок позволяет их склеивать аналогично \\\n", + "\n", + "4.5 Форматированные строки (f-строки) с использованием скобок\n", + "letter_a = 5\n", + "letter_b = 6\n", + "product_ab = letter_a * letter_b\n", + "\n", + "message = (\n", + " f\"when {letter_a} is multiplied by {letter_b}, \"\n", + " f\"the result is {product_ab}\"\n", + ")\n", + "print(message)\n", + "- f-строки позволяют создавать \"шаблоны\" с переменными\n", + "\n", + "4.6 Сложение строк с помощью +\n", + "\n", + "string_part1 = \"This is the first part, \"\n", + "string_part2 = \"and this is the second part.\"\n", + "full_string = string_part1 + string_part2\n", + "print(full_string)\n", + "- Обычная конкатенация\n", + "\n", + "5. Проверка на ошибки c помощью кнопки problems, где она находится?\n", + "- Слева от терминала\n", + "6. Где в vscode находится клиент гита? как в нём отправить коммит? как принять домашку?\n", + "- В левом вертикальном меню кнопка Source Control, для отправки коммита надо ввести имя коммита и нажать commit & push. Для принятия домашки нужно сделать pull\n", + "7. Что такое GIT? он локальный? В нём можно посмотреть историю изменений файлов и вернуться к любому коммиту?\n", + "- Git - система контроля версий, в первую очередь Git локальный. Да, с его помощью можно посмотреть всю историю изменений и и вернуться к любому коммиту\n", + "8. Как вставить картинку в маркдаун? \n", + "- сделать скриншот -> ctrl + v или ссылкой с помощью тега \n", + "9. Где посмотреть длину строки в vs code?\n", + "- В файле .py длина строки выводится в нижней строке информации \n", + "10. Как поменять тип ячейки с питона на маркдаун?\n", + "- Выйти из режима редактирования и нажать M или нажать три точки над ячейкой -> Change Cell to Markdown\n", + "11. Как запустить сразу все ячейки в юпитере?\n", + "- Run All\n", + "12. Как изменить размер картинки в юпитере? Нужно для этого знать HTML?\n", + "- Да, с помощью тега , знать весь HTML для этого необязательно, но конкретно с этим тегом надо разобраться\n", + "13. Какой хоткей чтобы запустить ячейку с смещением на следующую?\n", + "- Shift + Enter\n", + "14. Как включить отображение номеров строк в юпитере(Cell line numbers)?\n", + "- Show Cell Line Number или просто L\n", + "15. Что такое \"Go To\" чем это полезно? Как перейти сразу на ошибочную ячейку?\n", + "- Go To показывает, в какой ячейке ошибка, чтобы перейти к ней, надо нажать на Go To\n", + "16. Как очистить вывод ячеек которые уже запущены?\n", + "- Clear All Outputs\n", + "17. Как работать одновременно в нескольких файлах в VSCODE? Что такое SPLIT?\n", + "- нажать Split Editor, это позволяет одновременно открыть в разных окнах несколько файлов\n", + "18. Каким сочетанием убирается левый сайдбар?\n", + "- ctrl + B\n", + "19. Кнопка два листочка это наши локальные файлы?\n", + "- Да\n", + "20. Какая ошибка появилась в трассировке при запуске всех ячеек DICT или LIST?\n", + "- name 'Dict' is not defined\n", + "21. Вы ознакомились с https://t.me/c/1937296927/832/19307? и https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet?\n", + "- Да\n", + "22. Что такое валидация?\n", + "- Проверка данных на соответствие определённым критериям\n", + "23. Что такое трассировка ошибки?\n", + "- Подробные сведения об ошибке, которые Python выводит при её возникновении\n", + "24. Что значит отвалился интерпритатор?\n", + "- \"Сломался\" из-за ошибок во время выполнения программы\n" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/quiz.py b/quiz.py new file mode 100644 index 00000000..ccfb4a3e --- /dev/null +++ b/quiz.py @@ -0,0 +1,282 @@ +"""intro.""" + +# + +# quiz1 +# - + +# Список вопросов к видео https://youtu.be/hW_7hodGxVU?si=tCEVs00xGt2q61eW (АЛГОРИТМ ПРИНЯТИЯ И ОТДАЧИ ДОМАШКИ): +# +# (По желанию )В ответе подробно всё опишите и обязательно нужно указывать тайм код из видео где я это сказал, по желанию, дополнительно прикладываем скриншот из видео. +# Если вы знаете ответы на вопросы из Вашего опыта, то таймкоды из видео не надо указывать и т.д. +# +# 1) Как понять, что домашка пришла? +# - Руслан тегает ученика и пишет 'прими пулл' (или пишет, что надо сделать) - таймкод 0:12 +# 2) Как принять домашку? +# - Зайти в GitHub Desktop, нажать Fetch origin, зайти в History и посмотреть последний коммит, открыть репозиторий в vscode/cursor - таймкод 0:20 +# 3) Зачем нужна кнопка history и какие функции появляются при нажатии правой кнопки мыши на коммит? +# - Кнопка history содержит историю коммитов. При нажатии на коммит появляются функции Reset to commit, Checkout commit, Reorder commit, Revert changes in commit, Create branch from commit, Create tag, Cherry-pick commit, Copy SHA, Copy tag, View on GitHub +# +# 3.1) Где брать ссылку на коммит? куда её отправлять? +# - Ссылка в github после нажатия на 'view on github', отправляем в чат ТГ HomeWork +# 4) Что такое файл лога? +# - Файл с историей выполнения заданий, необходимо заполнять его проделанной работой после каждого урока +# +# 4.1) Когда нужно его пушить? +# - После выполнения ДЗ +# 5) Что такое интерпритатор? +# - Программа, читающая и выполняющая код +# 6) Где можно выбрать интерпритатор? +# - В окне Select Interpreter (можно открыть его, например, кликнув по текущему окружению в правом нижнем углу vscode) +# 7) Что такое модуль? +# - файл, содержащий определения функций, классов, переменных и т.д. +# 8) Как создать и отправить коммит? +# - в VScode это: Source control -> добавить changes в Stage -> написать commit message -> нажать Commit -> нажать Push +# 9) Как посмотреть что коммит точно отправлен и находится в github? +# - нажать view in github +# 10) Какая команда показывает что код не прошёл проверки на ошибки? +# - pre-commit run --all-files +# +# 10.1) Напишите список линтеров которые используются для проверки кода и дайте их краткую характеристику. +# - Pylint - всесторонний статический анализ кода, проверяет стиль, ошибки, качество +# - Pydocstyle - проверяет соответствие докстринг стандартам (PEP 257) +# - Flake8 - комбайн: проверяет стиль (PEP 8), сложность кода и логические ошибки +# - Mypy - статическая проверка типов (type checking) для Python +# - Black - автоматический форматтер кода, применяет единый стиль +# 11) Как узнать какой именно линтер не прошёл проверку? +# - В выводе этот линтер будет помечен как Failed +# 12) Линтер Pylint видит markdown? +# - Нет +# 13) Номер ячейки в терминале и номер ячейки в vs code может отличаться? в каком случае? +# - Может, т.к. линтер не считает markdown за ячейку +# 14) Где посмотреть номер ячейки в vscode? +# - в правом нижнем углу 'Cell ...' +# 15) В каком формате ipynb отправляется в гитхаб? причём здесь JSON? +# - Файл .ipynb — это JSON-файл с особой структурой. Jupyter Notebook сохраняет всё содержимое (код, вывод, метаданные) в виде стандартного текстового JSON-формата. GitHub просто отображает этот JSON в удобном для чтения виде. +# 16) Где посмотреть в какой ячейке ошибка? +# - либо в терминале после pre-commit, либо ошибка вывалится под самой ячейкой +# 17) Как запустить терминал? +# - ctrl + ` или Terminal -> New Terminal +# 18) Что такое линтер? +# - анализатор кода +# 19) В какой сайт нужно вставлять код ошибки если ошибка связана с pylint? +# - https://pylint.readthedocs.io/en/stable/ +# 20) Секция pydocstyle в большинстве случае автоматический закрывается после исправления ошибок в каком линтере? +# - Pylint +# 21) Что такое описание модуля? Оно должно отражать информацию о том что находится в модуле? +# - Да, должно вкратце отражать суть модуля +# 21) С какой git команды начинается утро программиста? +# - git pull +# 22) После внесения изменений в файлах, кнопка open in vs code пропадает в кошке, как по другому открыть vs code из кошки? +# - пкм по current repository -> open in vscode +# 23) Что такое stash? +# - локальное временное хранилище незакомиченных изменений. Часто требуется для избежания +# +# 23.1) Как сохранить стэш? +# git командa(подсказка: https://t.me/c/1937296927/3602/19531): +# - git stash save "name" +# Кнопка в vs code: +# - Source control -> Stashes -> Create Stash -> Enter +# +# 23.2) Как восстановить стэш(подсказка: https://t.me/c/1937296927/3602/25747)?: +# +# git команда(подсказка: https://t.me/c/1937296927/3602/19531)?: +# - GitHub -> Stashed Changes -> Restore +# +# 23.3) Различие между стэшем и коммитом. +# Когда лучше сохранить изменения в стэше, а когда коммитить. +# - Стэш - чаще всего используется, когда надо временно локально сохранить недоделанную работу. Коммит - это уже подготовка к передаче кода вовне. +# +# 23.4) Как просмотреть список сохраненных стэшей? +# git команда (подсказка: https://t.me/c/1937296927/3602/19531): +# - git stash list +# +# 23.5) Как удалить стэш? +# Команды для удаления отдельных стэшей или всех сразу. +# git команда (подсказка: https://t.me/c/1937296927/3602/19531): +# - git stash clear - удаляет все созданные +# - git stash drop stash@{n} - удаляет конкретные +# +# 23.6) Практические примеры использования стэша. +# Краткие сценарии, где стэш помогает. +# - Например, когда нужно срочно переключиться в другую ветку, но текущий код ещё не готов для коммита. Или когда происходит конфликт внесённых изменений. Или нужно обновить свою ветку, но нужно сохранит изменения, ещё не готовые к коммиту. +# 24) Где посмотреть что есть конфликт в файлах? +# - Githud Desktop сообщит об этом при пулле изменений с сервера +# +# 24.1) Когда он появляется? +# - Когда разные разработчики вносят изменения в один и тот же файл и пытаются одновременно сохранить их +# 25) Как решить конфликт в файлах? +# - Stash changes and continue -> выбрать последний коммит в истории и выбрать, чьи изменения в итоге оставить (внешние, локальные или оба) +# 26) Напишите правильное утверждение +# - Зелёное то что пришло с гитхаба и синее локальные изменения +# 27) Если мы работаем в одном файле, можно ли принять pull после того как вы спрячете в стэш свои изменения? +# - Да, можно +# +# 27.1) Что может произойти когда stash восстановите после принятия pull? +# - может произойти как автоматическое слияние (идеальный случай), так и конфликт, если правки в одних и тех же местах +# 28) Сколько способов решения конфликтов было показано в видео? Напишите ЧИСЛО и укажите их способы. +# - 3: accept current change, accept incoming change, accept both changes +# 29) Что делает кнопка complete merge? +# - Завершение слияния +# 30) В какой чат нужно писать если остались вопросы? +# - HELP ME +# 31) Что такое FORK? Зачем его делают? +# - Чтобы сделать независимую копию репозитория +# 32) Как скачать форкнутый репозиторий на локальный компьютер? +# - Например, с помощью GitHub Desktop: Code -> Open with GitHub Desktop +# 33) С какой вероятностью ваши ошибки были уже решены? и кто их решил? +# - С высокой вероятностью эти ошибки уже прорабатывались студентами ранее +# 34) Как создать файл в vs code? +# - нажать New file в левом верхнем углу +# 35) Файл лога нужно заполнять в конце каждого урока? +# - да +# +# ================== +# +# Дополнительные вопросы: +# 1)Какая команда конвертирует файл в py из ipynb? +# подсказка https://t.me/c/1937296927/1/26527 +# - jupyter nbconvert --to script <имя_файла.ipynb> +# +# 2) Что такое пакетный менеджер? Вы пользуетесь пакетным менеджером conda или pip? Какой лучше использовать для дата сайнс? +# - Пакетный менеджер - программа-помощник для установки, обновления, удаления и отслеживания зависимостей в пакетах +# - Использую pip, conda, poetry +# - Для Data Science лучше использовать conda +# +# 3) Почему расширение py лучше чем ipynb? +# - Для ipynb необходима интерактивная среда +# +# 4) Что такое pep8? +# подсказка:https://peps.python.org/pep-0008/ +# - Рекомендации по написанию/оформлению кода +# +# 4.1) линтеры проверяют на соблюдение pep8? +# - Да +# +# 4.2) Какая нотация используется для создания переменных? +# +# ответ на 85-95 страницы https://t.me/c/1937296927/1/16676 +# - snake_case +# +# 4.3) Может ли переменная состоять из одной буквы например андерскор "_" ? +# - Да +# +# 4.4) Зачем и где мы используем андерскор _ +# - Для игнорирования значений при распаковке, в именах переменных (leading, trailing, dunder, magic method), для улучшения читаемости чисел (1_000_000) +# +# 4.5) По PEP8 допустима переменная в одну букву? +# ответ на 85-95 страницы https://t.me/c/1937296927/1/16676 +# - PEP 8 не запрещает однобуквенные переменные, но даёт конкретные рекомендации, где их уместно использовать, чтобы не ухудшать читаемость кода (например, в циклах) + +# + +# quiz2 +# - + +# Список вопросов к видео https://youtu.be/Si9MfV8uJ-0?si=JXHe-tsgOEwSTI5E (НАСТРОЙКА VSCODE, перенос строк, линтеры, работа с ячейками): +# +# (По желанию)В ответе подробно всё опишите и обязательно нужно указывать тайм код из видео где я это сказал, по желанию, дополнительно прикладываем скриншот из видео. +# Если вы знаете ответы на вопросы из Вашего опыта, то таймкоды из видео не надо указывать и т.д. +# +# 1. Как включить автосохранение данных в VSCODE? +# - File -> Auto Save +# 2. Как настроить перенос строки? +# - Preferences -> Settings -> wrap -> Word Wrap = on -> Word Wrap Column = 79 +# 3. Сколько символов по pep8 разрешено на строке? +# - 79 +# 4. Какие способы переноса строк показаны в видео: +# - Перенос с помощью разбиения строки по переменным, конкатенации, +# +# 4.1 Строки с использованием обратного слэша (\) +# +# string_continued = "This is a long string that we want to " \ +# "split across multiple lines." +# print(string_continued) +# - Обратный слэш склеивает следующую строку с предыдущей +# +# 4.2 Тройные кавычки (''' или """) +# +# multi_line_string = """This is a string that spans +# multiple lines. You can write freely +# and it will keep the line breaks.""" +# print(multi_line_string) +# - Позволяет писать многострочный текст с сохранением переносов +# +# 4.3 Создание списка строк и объединение с помощью join +# +# strings = [ +# "This is the first line.", +# "This is the second line.", +# "This is the third line." +# ] +# result = "\n".join(strings) # Используем перенос строк '\n' +# print(result) +# - Метод join позволяет конкатенировать элементы массива +# +# 4.4 Использование круглых скобок для продолжения строки +# long_string = ( +# "This is a very long string that I would like to " +# "continue on the next line." +# ) +# print(long_string) +# - Перенос строк внутри скобок позволяет их склеивать аналогично \ +# +# 4.5 Форматированные строки (f-строки) с использованием скобок +# letter_a = 5 +# letter_b = 6 +# product_ab = letter_a * letter_b +# +# message = ( +# f"when {letter_a} is multiplied by {letter_b}, " +# f"the result is {product_ab}" +# ) +# print(message) +# - f-строки позволяют создавать "шаблоны" с переменными +# +# 4.6 Сложение строк с помощью + +# +# string_part1 = "This is the first part, " +# string_part2 = "and this is the second part." +# full_string = string_part1 + string_part2 +# print(full_string) +# - Обычная конкатенация +# +# 5. Проверка на ошибки c помощью кнопки problems, где она находится? +# - Слева от терминала +# 6. Где в vscode находится клиент гита? как в нём отправить коммит? как принять домашку? +# - В левом вертикальном меню кнопка Source Control, для отправки коммита надо ввести имя коммита и нажать commit & push. Для принятия домашки нужно сделать pull +# 7. Что такое GIT? он локальный? В нём можно посмотреть историю изменений файлов и вернуться к любому коммиту? +# - Git - система контроля версий, в первую очередь Git локальный. Да, с его помощью можно посмотреть всю историю изменений и и вернуться к любому коммиту +# 8. Как вставить картинку в маркдаун? +# - сделать скриншот -> ctrl + v или ссылкой с помощью тега +# 9. Где посмотреть длину строки в vs code? +# - В файле .py длина строки выводится в нижней строке информации +# 10. Как поменять тип ячейки с питона на маркдаун? +# - Выйти из режима редактирования и нажать M или нажать три точки над ячейкой -> Change Cell to Markdown +# 11. Как запустить сразу все ячейки в юпитере? +# - Run All +# 12. Как изменить размер картинки в юпитере? Нужно для этого знать HTML? +# - Да, с помощью тега , знать весь HTML для этого необязательно, но конкретно с этим тегом надо разобраться +# 13. Какой хоткей чтобы запустить ячейку с смещением на следующую? +# - Shift + Enter +# 14. Как включить отображение номеров строк в юпитере(Cell line numbers)? +# - Show Cell Line Number или просто L +# 15. Что такое "Go To" чем это полезно? Как перейти сразу на ошибочную ячейку? +# - Go To показывает, в какой ячейке ошибка, чтобы перейти к ней, надо нажать на Go To +# 16. Как очистить вывод ячеек которые уже запущены? +# - Clear All Outputs +# 17. Как работать одновременно в нескольких файлах в VSCODE? Что такое SPLIT? +# - нажать Split Editor, это позволяет одновременно открыть в разных окнах несколько файлов +# 18. Каким сочетанием убирается левый сайдбар? +# - ctrl + B +# 19. Кнопка два листочка это наши локальные файлы? +# - Да +# 20. Какая ошибка появилась в трассировке при запуске всех ячеек DICT или LIST? +# - name 'Dict' is not defined +# 21. Вы ознакомились с https://t.me/c/1937296927/832/19307? и https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet? +# - Да +# 22. Что такое валидация? +# - Проверка данных на соответствие определённым критериям +# 23. Что такое трассировка ошибки? +# - Подробные сведения об ошибке, которые Python выводит при её возникновении +# 24. Что значит отвалился интерпритатор? +# - "Сломался" из-за ошибок во время выполнения программы +# From 92f603204feeadd4ca2aa97c6c8049d529f5e30b Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Fri, 5 Sep 2025 00:25:56 +0300 Subject: [PATCH 03/14] [TASK] Commits #5 (https://github.com/SENATOROVAI/intro-cs/issues/5) closes https://github.com/SENATOROVAI/intro-cs/issues/5 --- log.ipynb | 63 ++++++-- log.py | 5 + python/commits.ipynb | 62 ++++++++ python/commits.py | 32 ++++ quiz.ipynb | 337 ------------------------------------------- quiz.py | 282 ------------------------------------ 6 files changed, 147 insertions(+), 634 deletions(-) create mode 100644 python/commits.ipynb create mode 100644 python/commits.py delete mode 100644 quiz.ipynb delete mode 100644 quiz.py diff --git a/log.ipynb b/log.ipynb index eeb0c519..863852e0 100644 --- a/log.ipynb +++ b/log.ipynb @@ -3,22 +3,11 @@ { "cell_type": "code", "execution_count": null, - "id": "e837aceb", + "id": "76e726de", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'intro 7.2'" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "\"\"\"intro 7.2.\"\"\"" + "\"\"\"intro.\"\"\"" ] }, { @@ -26,10 +15,54 @@ "id": "3a52e3c7", "metadata": {}, "source": [ - "18/08\n", + "18/08/25\n", "\n", "1. Прошёл intro (за исключением 20 пункта)." ] + }, + { + "cell_type": "markdown", + "id": "2c0865d0", + "metadata": {}, + "source": [ + "20/08/25\n", + "\n", + "1. Прошёл 9 модулей по курсу Python-разработчик с нуля.\n", + "2. Сделал половину quiz1 task6" + ] + }, + { + "cell_type": "markdown", + "id": "2a774295", + "metadata": {}, + "source": [ + "29/08/25\n", + "\n", + "1. Прошёл 10-12 модулей по курсу Python-разработчик с нуля.\n", + "2. Сделал quiz1 task6" + ] + }, + { + "cell_type": "markdown", + "id": "77dea2b7", + "metadata": {}, + "source": [ + "30/08/25\n", + "\n", + "1. Закончил курс Python-разработчик с нуля.\n", + "2. Сделал quiz2 task6" + ] + }, + { + "cell_type": "markdown", + "id": "e5e5728e", + "metadata": {}, + "source": [ + "05/09/25\n", + "\n", + "1. Сдал первые два issue (quiz, git)\n", + "2. Выполнил третий issue - commits" + ] } ], "metadata": { diff --git a/log.py b/log.py index 3bb6aae9..bd19c1ad 100644 --- a/log.py +++ b/log.py @@ -18,3 +18,8 @@ # # 1. Закончил курс Python-разработчик с нуля. # 2. Сделал quiz2 task6 + +# 05/09/25 +# +# 1. Сдал первые два issue (quiz, git) +# 2. Выполнил третий issue - commits diff --git a/python/commits.ipynb b/python/commits.ipynb new file mode 100644 index 00000000..8b8883ee --- /dev/null +++ b/python/commits.ipynb @@ -0,0 +1,62 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "b5c8ebe2", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "\"\"\"commits.\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "22afbd3d", + "metadata": {}, + "source": [ + "1. Опишите своими словами назначение каждого из этих типов коммитов:\n", + "feat - добавляет новую функцию в код (соответствует MINOR в Семантическом Версионировании)\n", + "fix - исправляет бак в коде (соответствует PATCH в Семантическом Версионировании)\n", + "docs - изменения в документации\n", + "style - изменения, не влияющие на смысл кода (пробелы, форматирование и т.д.)\n", + "refactor - изменение кода, которое не исправляет ошибку и не добавляет функцию\n", + "test - добавление отсутствующих или исправление существующих тестов\n", + "build - изменения, влияющие на систему сборки или внешние зависимости\n", + "ci - изменения в файлах конфигурации CI и скриптах\n", + "perf - изменение кода, повышающее производительность\n", + "chore - регулярные задачи по уходу за проектом (обновление инструментов, библиотек, другие технические операции, не влияющие на поведение продукта)\n", + "\n", + "2. Представьте, что вы исправили баг в функции, которая некорректно округляет числа. Сделайте фиктивный коммит и напишите для него сообщение в соответствии с Conventional Commits (используя тип fix).\n", + "- git commit -m 'fix: correct round numbers in function'\n", + "\n", + "3. Добавление новой функциональности:\n", + "Допустим, вы реализовали новую функцию generateReport в проекте. Сделайте фиктивный коммит с типом feat, отражающий добавление этой функциональности\n", + "- git commit -m 'feat: add generateReport function'\n", + "\n", + "4. Модификация формата кода или стилей:\n", + "Представьте, что вы поправили отступы и форматирование во всём проекте, не меняя логики кода. Сделайте фиктивный коммит с типом style\n", + "- git commit -m 'style: reformat codebase with consistent indention'\n", + "\n", + "5. Документация и тестирование:\n", + "\n", + "Сделайте фиктивный коммит с типом docs, добавляющий или улучшающий документацию для вашей новой функции.\n", + "- git commit -m 'docs: add JSDoc for generateReport function'\n", + "\n", + "Сделайте фиктивный коммит с типом test, добавляющий тесты для этой же функции.\n", + "- git commit -m 'test: add unit tests for generateReport function'" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python/commits.py b/python/commits.py new file mode 100644 index 00000000..774bbc10 --- /dev/null +++ b/python/commits.py @@ -0,0 +1,32 @@ +"""commits.""" + +# 1. Опишите своими словами назначение каждого из этих типов коммитов: +# feat - добавляет новую функцию в код (соответствует MINOR в Семантическом Версионировании) +# fix - исправляет бак в коде (соответствует PATCH в Семантическом Версионировании) +# docs - изменения в документации +# style - изменения, не влияющие на смысл кода (пробелы, форматирование и т.д.) +# refactor - изменение кода, которое не исправляет ошибку и не добавляет функцию +# test - добавление отсутствующих или исправление существующих тестов +# build - изменения, влияющие на систему сборки или внешние зависимости +# ci - изменения в файлах конфигурации CI и скриптах +# perf - изменение кода, повышающее производительность +# chore - регулярные задачи по уходу за проектом (обновление инструментов, библиотек, другие технические операции, не влияющие на поведение продукта) +# +# 2. Представьте, что вы исправили баг в функции, которая некорректно округляет числа. Сделайте фиктивный коммит и напишите для него сообщение в соответствии с Conventional Commits (используя тип fix). +# - git commit -m 'fix: correct round numbers in function' +# +# 3. Добавление новой функциональности: +# Допустим, вы реализовали новую функцию generateReport в проекте. Сделайте фиктивный коммит с типом feat, отражающий добавление этой функциональности +# - git commit -m 'feat: add generateReport function' +# +# 4. Модификация формата кода или стилей: +# Представьте, что вы поправили отступы и форматирование во всём проекте, не меняя логики кода. Сделайте фиктивный коммит с типом style +# - git commit -m 'style: reformat codebase with consistent indention' +# +# 5. Документация и тестирование: +# +# Сделайте фиктивный коммит с типом docs, добавляющий или улучшающий документацию для вашей новой функции. +# - git commit -m 'docs: add JSDoc for generateReport function' +# +# Сделайте фиктивный коммит с типом test, добавляющий тесты для этой же функции. +# - git commit -m 'test: add unit tests for generateReport function' diff --git a/quiz.ipynb b/quiz.ipynb deleted file mode 100644 index 5b0713f3..00000000 --- a/quiz.ipynb +++ /dev/null @@ -1,337 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "a0970523", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "\"\"\"intro.\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "55493f5a", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# quiz1" - ] - }, - { - "cell_type": "markdown", - "id": "562dd714", - "metadata": {}, - "source": [ - "Список вопросов к видео https://youtu.be/hW_7hodGxVU?si=tCEVs00xGt2q61eW (АЛГОРИТМ ПРИНЯТИЯ И ОТДАЧИ ДОМАШКИ):\n", - " \n", - "(По желанию )В ответе подробно всё опишите и обязательно нужно указывать тайм код из видео где я это сказал, по желанию, дополнительно прикладываем скриншот из видео.\n", - "Если вы знаете ответы на вопросы из Вашего опыта, то таймкоды из видео не надо указывать и т.д.\n", - "\n", - "1) Как понять, что домашка пришла?\n", - "- Руслан тегает ученика и пишет 'прими пулл' (или пишет, что надо сделать) - таймкод 0:12\n", - "2) Как принять домашку?\n", - "- Зайти в GitHub Desktop, нажать Fetch origin, зайти в History и посмотреть последний коммит, открыть репозиторий в vscode/cursor - таймкод 0:20\n", - "3) Зачем нужна кнопка history и какие функции появляются при нажатии правой кнопки мыши на коммит?\n", - "- Кнопка history содержит историю коммитов. При нажатии на коммит появляются функции Reset to commit, Checkout commit, Reorder commit, Revert changes in commit, Create branch from commit, Create tag, Cherry-pick commit, Copy SHA, Copy tag, View on GitHub \n", - "\n", - "3.1) Где брать ссылку на коммит? куда её отправлять?\n", - "- Ссылка в github после нажатия на 'view on github', отправляем в чат ТГ HomeWork\n", - "4) Что такое файл лога? \n", - "- Файл с историей выполнения заданий, необходимо заполнять его проделанной работой после каждого урока\n", - "\n", - "4.1) Когда нужно его пушить?\n", - "- После выполнения ДЗ\n", - "5) Что такое интерпритатор? \n", - "- Программа, читающая и выполняющая код\n", - "6) Где можно выбрать интерпритатор?\n", - "- В окне Select Interpreter (можно открыть его, например, кликнув по текущему окружению в правом нижнем углу vscode)\n", - "7) Что такое модуль? \n", - "- файл, содержащий определения функций, классов, переменных и т.д.\n", - "8) Как создать и отправить коммит?\n", - "- в VScode это: Source control -> добавить changes в Stage -> написать commit message -> нажать Commit -> нажать Push\n", - "9) Как посмотреть что коммит точно отправлен и находится в github?\n", - "- нажать view in github\n", - "10) Какая команда показывает что код не прошёл проверки на ошибки? \n", - "- pre-commit run --all-files\n", - "\n", - "10.1) Напишите список линтеров которые используются для проверки кода и дайте их краткую характеристику.\n", - "- Pylint - всесторонний статический анализ кода, проверяет стиль, ошибки, качество\n", - "- Pydocstyle - проверяет соответствие докстринг стандартам (PEP 257)\n", - "- Flake8 - комбайн: проверяет стиль (PEP 8), сложность кода и логические ошибки\n", - "- Mypy - статическая проверка типов (type checking) для Python\n", - "- Black - автоматический форматтер кода, применяет единый стиль\n", - "11) Как узнать какой именно линтер не прошёл проверку?\n", - "- В выводе этот линтер будет помечен как Failed\n", - "12) Линтер Pylint видит markdown?\n", - "- Нет\n", - "13) Номер ячейки в терминале и номер ячейки в vs code может отличаться? в каком случае?\n", - "- Может, т.к. линтер не считает markdown за ячейку\n", - "14) Где посмотреть номер ячейки в vscode?\n", - "- в правом нижнем углу 'Cell ...'\n", - "15) В каком формате ipynb отправляется в гитхаб? причём здесь JSON?\n", - "- Файл .ipynb — это JSON-файл с особой структурой. Jupyter Notebook сохраняет всё содержимое (код, вывод, метаданные) в виде стандартного текстового JSON-формата. GitHub просто отображает этот JSON в удобном для чтения виде.\n", - "16) Где посмотреть в какой ячейке ошибка?\n", - "- либо в терминале после pre-commit, либо ошибка вывалится под самой ячейкой \n", - "17) Как запустить терминал?\n", - "- ctrl + ` или Terminal -> New Terminal\n", - "18) Что такое линтер?\n", - "- анализатор кода\n", - "19) В какой сайт нужно вставлять код ошибки если ошибка связана с pylint?\n", - "- https://pylint.readthedocs.io/en/stable/\n", - "20) Секция pydocstyle в большинстве случае автоматический закрывается после исправления ошибок в каком линтере?\n", - "- Pylint\n", - "21) Что такое описание модуля? Оно должно отражать информацию о том что находится в модуле?\n", - "- Да, должно вкратце отражать суть модуля\n", - "21) С какой git команды начинается утро программиста?\n", - "- git pull\n", - "22) После внесения изменений в файлах, кнопка open in vs code пропадает в кошке, как по другому открыть vs code из кошки?\n", - "- пкм по current repository -> open in vscode\n", - "23) Что такое stash? \n", - " - локальное временное хранилище незакомиченных изменений. Часто требуется для избежания \n", - "\n", - "23.1) Как сохранить стэш?\n", - " git командa(подсказка: https://t.me/c/1937296927/3602/19531): \n", - " - git stash save \"name\"\n", - " Кнопка в vs code:\n", - " - Source control -> Stashes -> Create Stash -> Enter\n", - "\n", - "23.2) Как восстановить стэш(подсказка: https://t.me/c/1937296927/3602/25747)?:\n", - "\n", - " git команда(подсказка: https://t.me/c/1937296927/3602/19531)?:\n", - " - GitHub -> Stashed Changes -> Restore\n", - "\n", - "23.3) Различие между стэшем и коммитом. \n", - " Когда лучше сохранить изменения в стэше, а когда коммитить.\n", - " - Стэш - чаще всего используется, когда надо временно локально сохранить недоделанную работу. Коммит - это уже подготовка к передаче кода вовне.\n", - "\n", - "23.4) Как просмотреть список сохраненных стэшей? \n", - " git команда (подсказка: https://t.me/c/1937296927/3602/19531):\n", - " - git stash list\n", - "\n", - "23.5) Как удалить стэш? \n", - " Команды для удаления отдельных стэшей или всех сразу.\n", - " git команда (подсказка: https://t.me/c/1937296927/3602/19531):\n", - " - git stash clear - удаляет все созданные\n", - " - git stash drop stash@{n} - удаляет конкретные\n", - "\n", - "23.6) Практические примеры использования стэша. \n", - " Краткие сценарии, где стэш помогает.\n", - "- Например, когда нужно срочно переключиться в другую ветку, но текущий код ещё не готов для коммита. Или когда происходит конфликт внесённых изменений. Или нужно обновить свою ветку, но нужно сохранит изменения, ещё не готовые к коммиту.\n", - "24) Где посмотреть что есть конфликт в файлах? \n", - "- Githud Desktop сообщит об этом при пулле изменений с сервера\n", - "\n", - "24.1) Когда он появляется?\n", - "- Когда разные разработчики вносят изменения в один и тот же файл и пытаются одновременно сохранить их\n", - "25) Как решить конфликт в файлах?\n", - "- Stash changes and continue -> выбрать последний коммит в истории и выбрать, чьи изменения в итоге оставить (внешние, локальные или оба)\n", - "26) Напишите правильное утверждение\n", - "- Зелёное то что пришло с гитхаба и синее локальные изменения\n", - "27) Если мы работаем в одном файле, можно ли принять pull после того как вы спрячете в стэш свои изменения? \n", - "- Да, можно\n", - "\n", - "27.1) Что может произойти когда stash восстановите после принятия pull?\n", - "- может произойти как автоматическое слияние (идеальный случай), так и конфликт, если правки в одних и тех же местах\n", - "28) Сколько способов решения конфликтов было показано в видео? Напишите ЧИСЛО и укажите их способы.\n", - "- 3: accept current change, accept incoming change, accept both changes\n", - "29) Что делает кнопка complete merge?\n", - "- Завершение слияния\n", - "30) В какой чат нужно писать если остались вопросы?\n", - "- HELP ME\n", - "31) Что такое FORK? Зачем его делают? \n", - "- Чтобы сделать независимую копию репозитория\n", - "32) Как скачать форкнутый репозиторий на локальный компьютер?\n", - "- Например, с помощью GitHub Desktop: Code -> Open with GitHub Desktop\n", - "33) С какой вероятностью ваши ошибки были уже решены? и кто их решил?\n", - "- С высокой вероятностью эти ошибки уже прорабатывались студентами ранее\n", - "34) Как создать файл в vs code?\n", - "- нажать New file в левом верхнем углу\n", - "35) Файл лога нужно заполнять в конце каждого урока?\n", - "- да\n", - "\n", - "==================\n", - "\n", - "Дополнительные вопросы:\n", - "1)Какая команда конвертирует файл в py из ipynb? \n", - "подсказка https://t.me/c/1937296927/1/26527 \n", - "- jupyter nbconvert --to script <имя_файла.ipynb>\n", - "\n", - "2) Что такое пакетный менеджер? Вы пользуетесь пакетным менеджером conda или pip? Какой лучше использовать для дата сайнс?\n", - "- Пакетный менеджер - программа-помощник для установки, обновления, удаления и отслеживания зависимостей в пакетах\n", - "- Использую pip, conda, poetry\n", - "- Для Data Science лучше использовать conda\n", - "\n", - "3) Почему расширение py лучше чем ipynb?\n", - "- Для ipynb необходима интерактивная среда\n", - "\n", - "4) Что такое pep8? \n", - "подсказка:https://peps.python.org/pep-0008/\n", - "- Рекомендации по написанию/оформлению кода \n", - "\n", - "4.1) линтеры проверяют на соблюдение pep8?\n", - "- Да\n", - "\n", - "4.2) Какая нотация используется для создания переменных? \n", - "\n", - "ответ на 85-95 страницы https://t.me/c/1937296927/1/16676\n", - "- snake_case\n", - "\n", - "4.3) Может ли переменная состоять из одной буквы например андерскор \"_\" ?\n", - "- Да\n", - "\n", - "4.4) Зачем и где мы используем андерскор _ \n", - "- Для игнорирования значений при распаковке, в именах переменных (leading, trailing, dunder, magic method), для улучшения читаемости чисел (1_000_000) \n", - "\n", - "4.5) По PEP8 допустима переменная в одну букву?\n", - "ответ на 85-95 страницы https://t.me/c/1937296927/1/16676\n", - "- PEP 8 не запрещает однобуквенные переменные, но даёт конкретные рекомендации, где их уместно использовать, чтобы не ухудшать читаемость кода (например, в циклах)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e8d34d69", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# quiz2" - ] - }, - { - "cell_type": "markdown", - "id": "7371631e", - "metadata": {}, - "source": [ - "Список вопросов к видео https://youtu.be/Si9MfV8uJ-0?si=JXHe-tsgOEwSTI5E (НАСТРОЙКА VSCODE, перенос строк, линтеры, работа с ячейками):\n", - "\n", - "(По желанию)В ответе подробно всё опишите и обязательно нужно указывать тайм код из видео где я это сказал, по желанию, дополнительно прикладываем скриншот из видео.\n", - "Если вы знаете ответы на вопросы из Вашего опыта, то таймкоды из видео не надо указывать и т.д.\n", - "\n", - "1. Как включить автосохранение данных в VSCODE?\n", - "- File -> Auto Save\n", - "2. Как настроить перенос строки? \n", - "- Preferences -> Settings -> wrap -> Word Wrap = on -> Word Wrap Column = 79\n", - "3. Сколько символов по pep8 разрешено на строке?\n", - "- 79\n", - "4. Какие способы переноса строк показаны в видео:\n", - "- Перенос с помощью разбиения строки по переменным, конкатенации, \n", - "\n", - "4.1 Строки с использованием обратного слэша (\\)\n", - "\n", - "string_continued = \"This is a long string that we want to \" \\\n", - " \"split across multiple lines.\"\n", - "print(string_continued)\n", - "- Обратный слэш склеивает следующую строку с предыдущей\n", - "\n", - "4.2 Тройные кавычки (''' или \"\"\") \n", - "\n", - "multi_line_string = \"\"\"This is a string that spans\n", - "multiple lines. You can write freely\n", - "and it will keep the line breaks.\"\"\"\n", - "print(multi_line_string)\n", - " - Позволяет писать многострочный текст с сохранением переносов\n", - "\n", - "4.3 Создание списка строк и объединение с помощью join\n", - "\n", - "strings = [\n", - " \"This is the first line.\",\n", - " \"This is the second line.\",\n", - " \"This is the third line.\"\n", - "]\n", - "result = \"\\n\".join(strings) # Используем перенос строк '\\n'\n", - "print(result)\n", - "- Метод join позволяет конкатенировать элементы массива\n", - "\n", - "4.4 Использование круглых скобок для продолжения строки\n", - "long_string = (\n", - " \"This is a very long string that I would like to \"\n", - " \"continue on the next line.\"\n", - ")\n", - "print(long_string)\n", - "- Перенос строк внутри скобок позволяет их склеивать аналогично \\\n", - "\n", - "4.5 Форматированные строки (f-строки) с использованием скобок\n", - "letter_a = 5\n", - "letter_b = 6\n", - "product_ab = letter_a * letter_b\n", - "\n", - "message = (\n", - " f\"when {letter_a} is multiplied by {letter_b}, \"\n", - " f\"the result is {product_ab}\"\n", - ")\n", - "print(message)\n", - "- f-строки позволяют создавать \"шаблоны\" с переменными\n", - "\n", - "4.6 Сложение строк с помощью +\n", - "\n", - "string_part1 = \"This is the first part, \"\n", - "string_part2 = \"and this is the second part.\"\n", - "full_string = string_part1 + string_part2\n", - "print(full_string)\n", - "- Обычная конкатенация\n", - "\n", - "5. Проверка на ошибки c помощью кнопки problems, где она находится?\n", - "- Слева от терминала\n", - "6. Где в vscode находится клиент гита? как в нём отправить коммит? как принять домашку?\n", - "- В левом вертикальном меню кнопка Source Control, для отправки коммита надо ввести имя коммита и нажать commit & push. Для принятия домашки нужно сделать pull\n", - "7. Что такое GIT? он локальный? В нём можно посмотреть историю изменений файлов и вернуться к любому коммиту?\n", - "- Git - система контроля версий, в первую очередь Git локальный. Да, с его помощью можно посмотреть всю историю изменений и и вернуться к любому коммиту\n", - "8. Как вставить картинку в маркдаун? \n", - "- сделать скриншот -> ctrl + v или ссылкой с помощью тега \n", - "9. Где посмотреть длину строки в vs code?\n", - "- В файле .py длина строки выводится в нижней строке информации \n", - "10. Как поменять тип ячейки с питона на маркдаун?\n", - "- Выйти из режима редактирования и нажать M или нажать три точки над ячейкой -> Change Cell to Markdown\n", - "11. Как запустить сразу все ячейки в юпитере?\n", - "- Run All\n", - "12. Как изменить размер картинки в юпитере? Нужно для этого знать HTML?\n", - "- Да, с помощью тега , знать весь HTML для этого необязательно, но конкретно с этим тегом надо разобраться\n", - "13. Какой хоткей чтобы запустить ячейку с смещением на следующую?\n", - "- Shift + Enter\n", - "14. Как включить отображение номеров строк в юпитере(Cell line numbers)?\n", - "- Show Cell Line Number или просто L\n", - "15. Что такое \"Go To\" чем это полезно? Как перейти сразу на ошибочную ячейку?\n", - "- Go To показывает, в какой ячейке ошибка, чтобы перейти к ней, надо нажать на Go To\n", - "16. Как очистить вывод ячеек которые уже запущены?\n", - "- Clear All Outputs\n", - "17. Как работать одновременно в нескольких файлах в VSCODE? Что такое SPLIT?\n", - "- нажать Split Editor, это позволяет одновременно открыть в разных окнах несколько файлов\n", - "18. Каким сочетанием убирается левый сайдбар?\n", - "- ctrl + B\n", - "19. Кнопка два листочка это наши локальные файлы?\n", - "- Да\n", - "20. Какая ошибка появилась в трассировке при запуске всех ячеек DICT или LIST?\n", - "- name 'Dict' is not defined\n", - "21. Вы ознакомились с https://t.me/c/1937296927/832/19307? и https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet?\n", - "- Да\n", - "22. Что такое валидация?\n", - "- Проверка данных на соответствие определённым критериям\n", - "23. Что такое трассировка ошибки?\n", - "- Подробные сведения об ошибке, которые Python выводит при её возникновении\n", - "24. Что значит отвалился интерпритатор?\n", - "- \"Сломался\" из-за ошибок во время выполнения программы\n" - ] - } - ], - "metadata": { - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/quiz.py b/quiz.py deleted file mode 100644 index ccfb4a3e..00000000 --- a/quiz.py +++ /dev/null @@ -1,282 +0,0 @@ -"""intro.""" - -# + -# quiz1 -# - - -# Список вопросов к видео https://youtu.be/hW_7hodGxVU?si=tCEVs00xGt2q61eW (АЛГОРИТМ ПРИНЯТИЯ И ОТДАЧИ ДОМАШКИ): -# -# (По желанию )В ответе подробно всё опишите и обязательно нужно указывать тайм код из видео где я это сказал, по желанию, дополнительно прикладываем скриншот из видео. -# Если вы знаете ответы на вопросы из Вашего опыта, то таймкоды из видео не надо указывать и т.д. -# -# 1) Как понять, что домашка пришла? -# - Руслан тегает ученика и пишет 'прими пулл' (или пишет, что надо сделать) - таймкод 0:12 -# 2) Как принять домашку? -# - Зайти в GitHub Desktop, нажать Fetch origin, зайти в History и посмотреть последний коммит, открыть репозиторий в vscode/cursor - таймкод 0:20 -# 3) Зачем нужна кнопка history и какие функции появляются при нажатии правой кнопки мыши на коммит? -# - Кнопка history содержит историю коммитов. При нажатии на коммит появляются функции Reset to commit, Checkout commit, Reorder commit, Revert changes in commit, Create branch from commit, Create tag, Cherry-pick commit, Copy SHA, Copy tag, View on GitHub -# -# 3.1) Где брать ссылку на коммит? куда её отправлять? -# - Ссылка в github после нажатия на 'view on github', отправляем в чат ТГ HomeWork -# 4) Что такое файл лога? -# - Файл с историей выполнения заданий, необходимо заполнять его проделанной работой после каждого урока -# -# 4.1) Когда нужно его пушить? -# - После выполнения ДЗ -# 5) Что такое интерпритатор? -# - Программа, читающая и выполняющая код -# 6) Где можно выбрать интерпритатор? -# - В окне Select Interpreter (можно открыть его, например, кликнув по текущему окружению в правом нижнем углу vscode) -# 7) Что такое модуль? -# - файл, содержащий определения функций, классов, переменных и т.д. -# 8) Как создать и отправить коммит? -# - в VScode это: Source control -> добавить changes в Stage -> написать commit message -> нажать Commit -> нажать Push -# 9) Как посмотреть что коммит точно отправлен и находится в github? -# - нажать view in github -# 10) Какая команда показывает что код не прошёл проверки на ошибки? -# - pre-commit run --all-files -# -# 10.1) Напишите список линтеров которые используются для проверки кода и дайте их краткую характеристику. -# - Pylint - всесторонний статический анализ кода, проверяет стиль, ошибки, качество -# - Pydocstyle - проверяет соответствие докстринг стандартам (PEP 257) -# - Flake8 - комбайн: проверяет стиль (PEP 8), сложность кода и логические ошибки -# - Mypy - статическая проверка типов (type checking) для Python -# - Black - автоматический форматтер кода, применяет единый стиль -# 11) Как узнать какой именно линтер не прошёл проверку? -# - В выводе этот линтер будет помечен как Failed -# 12) Линтер Pylint видит markdown? -# - Нет -# 13) Номер ячейки в терминале и номер ячейки в vs code может отличаться? в каком случае? -# - Может, т.к. линтер не считает markdown за ячейку -# 14) Где посмотреть номер ячейки в vscode? -# - в правом нижнем углу 'Cell ...' -# 15) В каком формате ipynb отправляется в гитхаб? причём здесь JSON? -# - Файл .ipynb — это JSON-файл с особой структурой. Jupyter Notebook сохраняет всё содержимое (код, вывод, метаданные) в виде стандартного текстового JSON-формата. GitHub просто отображает этот JSON в удобном для чтения виде. -# 16) Где посмотреть в какой ячейке ошибка? -# - либо в терминале после pre-commit, либо ошибка вывалится под самой ячейкой -# 17) Как запустить терминал? -# - ctrl + ` или Terminal -> New Terminal -# 18) Что такое линтер? -# - анализатор кода -# 19) В какой сайт нужно вставлять код ошибки если ошибка связана с pylint? -# - https://pylint.readthedocs.io/en/stable/ -# 20) Секция pydocstyle в большинстве случае автоматический закрывается после исправления ошибок в каком линтере? -# - Pylint -# 21) Что такое описание модуля? Оно должно отражать информацию о том что находится в модуле? -# - Да, должно вкратце отражать суть модуля -# 21) С какой git команды начинается утро программиста? -# - git pull -# 22) После внесения изменений в файлах, кнопка open in vs code пропадает в кошке, как по другому открыть vs code из кошки? -# - пкм по current repository -> open in vscode -# 23) Что такое stash? -# - локальное временное хранилище незакомиченных изменений. Часто требуется для избежания -# -# 23.1) Как сохранить стэш? -# git командa(подсказка: https://t.me/c/1937296927/3602/19531): -# - git stash save "name" -# Кнопка в vs code: -# - Source control -> Stashes -> Create Stash -> Enter -# -# 23.2) Как восстановить стэш(подсказка: https://t.me/c/1937296927/3602/25747)?: -# -# git команда(подсказка: https://t.me/c/1937296927/3602/19531)?: -# - GitHub -> Stashed Changes -> Restore -# -# 23.3) Различие между стэшем и коммитом. -# Когда лучше сохранить изменения в стэше, а когда коммитить. -# - Стэш - чаще всего используется, когда надо временно локально сохранить недоделанную работу. Коммит - это уже подготовка к передаче кода вовне. -# -# 23.4) Как просмотреть список сохраненных стэшей? -# git команда (подсказка: https://t.me/c/1937296927/3602/19531): -# - git stash list -# -# 23.5) Как удалить стэш? -# Команды для удаления отдельных стэшей или всех сразу. -# git команда (подсказка: https://t.me/c/1937296927/3602/19531): -# - git stash clear - удаляет все созданные -# - git stash drop stash@{n} - удаляет конкретные -# -# 23.6) Практические примеры использования стэша. -# Краткие сценарии, где стэш помогает. -# - Например, когда нужно срочно переключиться в другую ветку, но текущий код ещё не готов для коммита. Или когда происходит конфликт внесённых изменений. Или нужно обновить свою ветку, но нужно сохранит изменения, ещё не готовые к коммиту. -# 24) Где посмотреть что есть конфликт в файлах? -# - Githud Desktop сообщит об этом при пулле изменений с сервера -# -# 24.1) Когда он появляется? -# - Когда разные разработчики вносят изменения в один и тот же файл и пытаются одновременно сохранить их -# 25) Как решить конфликт в файлах? -# - Stash changes and continue -> выбрать последний коммит в истории и выбрать, чьи изменения в итоге оставить (внешние, локальные или оба) -# 26) Напишите правильное утверждение -# - Зелёное то что пришло с гитхаба и синее локальные изменения -# 27) Если мы работаем в одном файле, можно ли принять pull после того как вы спрячете в стэш свои изменения? -# - Да, можно -# -# 27.1) Что может произойти когда stash восстановите после принятия pull? -# - может произойти как автоматическое слияние (идеальный случай), так и конфликт, если правки в одних и тех же местах -# 28) Сколько способов решения конфликтов было показано в видео? Напишите ЧИСЛО и укажите их способы. -# - 3: accept current change, accept incoming change, accept both changes -# 29) Что делает кнопка complete merge? -# - Завершение слияния -# 30) В какой чат нужно писать если остались вопросы? -# - HELP ME -# 31) Что такое FORK? Зачем его делают? -# - Чтобы сделать независимую копию репозитория -# 32) Как скачать форкнутый репозиторий на локальный компьютер? -# - Например, с помощью GitHub Desktop: Code -> Open with GitHub Desktop -# 33) С какой вероятностью ваши ошибки были уже решены? и кто их решил? -# - С высокой вероятностью эти ошибки уже прорабатывались студентами ранее -# 34) Как создать файл в vs code? -# - нажать New file в левом верхнем углу -# 35) Файл лога нужно заполнять в конце каждого урока? -# - да -# -# ================== -# -# Дополнительные вопросы: -# 1)Какая команда конвертирует файл в py из ipynb? -# подсказка https://t.me/c/1937296927/1/26527 -# - jupyter nbconvert --to script <имя_файла.ipynb> -# -# 2) Что такое пакетный менеджер? Вы пользуетесь пакетным менеджером conda или pip? Какой лучше использовать для дата сайнс? -# - Пакетный менеджер - программа-помощник для установки, обновления, удаления и отслеживания зависимостей в пакетах -# - Использую pip, conda, poetry -# - Для Data Science лучше использовать conda -# -# 3) Почему расширение py лучше чем ipynb? -# - Для ipynb необходима интерактивная среда -# -# 4) Что такое pep8? -# подсказка:https://peps.python.org/pep-0008/ -# - Рекомендации по написанию/оформлению кода -# -# 4.1) линтеры проверяют на соблюдение pep8? -# - Да -# -# 4.2) Какая нотация используется для создания переменных? -# -# ответ на 85-95 страницы https://t.me/c/1937296927/1/16676 -# - snake_case -# -# 4.3) Может ли переменная состоять из одной буквы например андерскор "_" ? -# - Да -# -# 4.4) Зачем и где мы используем андерскор _ -# - Для игнорирования значений при распаковке, в именах переменных (leading, trailing, dunder, magic method), для улучшения читаемости чисел (1_000_000) -# -# 4.5) По PEP8 допустима переменная в одну букву? -# ответ на 85-95 страницы https://t.me/c/1937296927/1/16676 -# - PEP 8 не запрещает однобуквенные переменные, но даёт конкретные рекомендации, где их уместно использовать, чтобы не ухудшать читаемость кода (например, в циклах) - -# + -# quiz2 -# - - -# Список вопросов к видео https://youtu.be/Si9MfV8uJ-0?si=JXHe-tsgOEwSTI5E (НАСТРОЙКА VSCODE, перенос строк, линтеры, работа с ячейками): -# -# (По желанию)В ответе подробно всё опишите и обязательно нужно указывать тайм код из видео где я это сказал, по желанию, дополнительно прикладываем скриншот из видео. -# Если вы знаете ответы на вопросы из Вашего опыта, то таймкоды из видео не надо указывать и т.д. -# -# 1. Как включить автосохранение данных в VSCODE? -# - File -> Auto Save -# 2. Как настроить перенос строки? -# - Preferences -> Settings -> wrap -> Word Wrap = on -> Word Wrap Column = 79 -# 3. Сколько символов по pep8 разрешено на строке? -# - 79 -# 4. Какие способы переноса строк показаны в видео: -# - Перенос с помощью разбиения строки по переменным, конкатенации, -# -# 4.1 Строки с использованием обратного слэша (\) -# -# string_continued = "This is a long string that we want to " \ -# "split across multiple lines." -# print(string_continued) -# - Обратный слэш склеивает следующую строку с предыдущей -# -# 4.2 Тройные кавычки (''' или """) -# -# multi_line_string = """This is a string that spans -# multiple lines. You can write freely -# and it will keep the line breaks.""" -# print(multi_line_string) -# - Позволяет писать многострочный текст с сохранением переносов -# -# 4.3 Создание списка строк и объединение с помощью join -# -# strings = [ -# "This is the first line.", -# "This is the second line.", -# "This is the third line." -# ] -# result = "\n".join(strings) # Используем перенос строк '\n' -# print(result) -# - Метод join позволяет конкатенировать элементы массива -# -# 4.4 Использование круглых скобок для продолжения строки -# long_string = ( -# "This is a very long string that I would like to " -# "continue on the next line." -# ) -# print(long_string) -# - Перенос строк внутри скобок позволяет их склеивать аналогично \ -# -# 4.5 Форматированные строки (f-строки) с использованием скобок -# letter_a = 5 -# letter_b = 6 -# product_ab = letter_a * letter_b -# -# message = ( -# f"when {letter_a} is multiplied by {letter_b}, " -# f"the result is {product_ab}" -# ) -# print(message) -# - f-строки позволяют создавать "шаблоны" с переменными -# -# 4.6 Сложение строк с помощью + -# -# string_part1 = "This is the first part, " -# string_part2 = "and this is the second part." -# full_string = string_part1 + string_part2 -# print(full_string) -# - Обычная конкатенация -# -# 5. Проверка на ошибки c помощью кнопки problems, где она находится? -# - Слева от терминала -# 6. Где в vscode находится клиент гита? как в нём отправить коммит? как принять домашку? -# - В левом вертикальном меню кнопка Source Control, для отправки коммита надо ввести имя коммита и нажать commit & push. Для принятия домашки нужно сделать pull -# 7. Что такое GIT? он локальный? В нём можно посмотреть историю изменений файлов и вернуться к любому коммиту? -# - Git - система контроля версий, в первую очередь Git локальный. Да, с его помощью можно посмотреть всю историю изменений и и вернуться к любому коммиту -# 8. Как вставить картинку в маркдаун? -# - сделать скриншот -> ctrl + v или ссылкой с помощью тега -# 9. Где посмотреть длину строки в vs code? -# - В файле .py длина строки выводится в нижней строке информации -# 10. Как поменять тип ячейки с питона на маркдаун? -# - Выйти из режима редактирования и нажать M или нажать три точки над ячейкой -> Change Cell to Markdown -# 11. Как запустить сразу все ячейки в юпитере? -# - Run All -# 12. Как изменить размер картинки в юпитере? Нужно для этого знать HTML? -# - Да, с помощью тега , знать весь HTML для этого необязательно, но конкретно с этим тегом надо разобраться -# 13. Какой хоткей чтобы запустить ячейку с смещением на следующую? -# - Shift + Enter -# 14. Как включить отображение номеров строк в юпитере(Cell line numbers)? -# - Show Cell Line Number или просто L -# 15. Что такое "Go To" чем это полезно? Как перейти сразу на ошибочную ячейку? -# - Go To показывает, в какой ячейке ошибка, чтобы перейти к ней, надо нажать на Go To -# 16. Как очистить вывод ячеек которые уже запущены? -# - Clear All Outputs -# 17. Как работать одновременно в нескольких файлах в VSCODE? Что такое SPLIT? -# - нажать Split Editor, это позволяет одновременно открыть в разных окнах несколько файлов -# 18. Каким сочетанием убирается левый сайдбар? -# - ctrl + B -# 19. Кнопка два листочка это наши локальные файлы? -# - Да -# 20. Какая ошибка появилась в трассировке при запуске всех ячеек DICT или LIST? -# - name 'Dict' is not defined -# 21. Вы ознакомились с https://t.me/c/1937296927/832/19307? и https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet? -# - Да -# 22. Что такое валидация? -# - Проверка данных на соответствие определённым критериям -# 23. Что такое трассировка ошибки? -# - Подробные сведения об ошибке, которые Python выводит при её возникновении -# 24. Что значит отвалился интерпритатор? -# - "Сломался" из-за ошибок во время выполнения программы -# From 6c4ab0cdd3e53511c9e00bb6b2afd1b4ed7c0193 Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Mon, 8 Sep 2025 20:55:50 +0300 Subject: [PATCH 04/14] [TASK] STASH #3 (https://github.com/SENATOROVAI/intro-cs/issues/3) Closes https://github.com/SENATOROVAI/intro-cs/issues/3 --- git/stash.ipynb | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ git/stash.py | 36 ++++++++++++++++++++++++++++ log.ipynb | 10 ++++++++ log.py | 4 ++++ 4 files changed, 112 insertions(+) create mode 100644 git/stash.ipynb create mode 100644 git/stash.py diff --git a/git/stash.ipynb b/git/stash.ipynb new file mode 100644 index 00000000..3c45fcd4 --- /dev/null +++ b/git/stash.ipynb @@ -0,0 +1,62 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "4a5ca8f0", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"stash.\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "f3b786f2", + "metadata": {}, + "source": [ + "1. Что делает команда git stash?\n", + "- сохраняет незакомиченные изменения в локальное хранилище\n", + "2. Как просмотреть список всех сохранённых изменений (стэшей)?\n", + "- git stash list\n", + "3. Какая команда применяется для использования верхнего стэша?\n", + "- git stash apply или git stash pop\n", + "4. Как применить конкретный стэш по его номеру?\n", + "- git stash apply stash@{number} или git stash pop stash@{number}\n", + "5. Чем отличается команда git stash apply от git stash pop?\n", + "- apply применяет изменения из стэша, при этом оставляя их в стэше; pop применяет изменения, удаляя их из стэша\n", + "6. Что делает команда git stash drop?\n", + "- удаляет спрятанные в конкретный стэш изменения, не применяя их\n", + "7. Как полностью очистить все сохранённые стэши?\n", + "- git stash clear\n", + "8. В каких случаях удобно использовать git stash?\n", + "- Когда нужно срочно переключиться на другую ветку или задачу; когда нужно очистить рабочее пространство перед выполнением pull или merge; когда необходимо временно сохранить изменения, которые ещё не готовы для коммита; чтобы протестировать что-то в чистом рабочем каталоге\n", + "9. Что произойдёт, если выполнить git stash pop, но в проекте есть конфликтующие изменения?\n", + "- Появится сообщение о конфликте, который необходимо будет разрешить вручную\n", + "10. Можно ли восстановить удалённый стэш после выполнения git stash drop?\n", + "- Да, если не сработал сборщик мусора Git\n", + "11. Что делает команда git stash save \"NAME_STASH\"\n", + "- Сохраняет стэш с описательным именем\n", + "12. Что делает команда git stash apply \"NUMBER_STASH\"\n", + "- Применяет изменения конкретного стэша, оставляя изменения в стэше\n", + "13. Что делает команда git stash pop \"NUMBER_STASH\"\n", + "- Применяет изменения конкретного стэша, удаляя изменения из стэша\n", + "14. Сохраните текущие изменения в стэш под названием \"SENATOROV ver1\", вставьте скриншот из терминала\n", + "- ![](capture_20250908203348657.bmp)\n", + "15. Внесите любые изменения в ваш репозиторий и сохраните второй стэш под именем \"SENATOROV ver2\"\n", + "- ![](capture_20250908203836569.bmp)\n", + "16. Восстановите ваш стэш \"SENATOROV ver1\", вставьте скриншот из терминала\n", + "- ![](capture_20250908204438177.bmp)\n", + "17. Удалите все стеши из истории, вставьте скриншот из терминала\n", + "- ![](capture_20250908204600452.bmp)" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/git/stash.py b/git/stash.py new file mode 100644 index 00000000..82c121d5 --- /dev/null +++ b/git/stash.py @@ -0,0 +1,36 @@ +"""stash.""" + +# 1. Что делает команда git stash? +# - сохраняет незакомиченные изменения в локальное хранилище +# 2. Как просмотреть список всех сохранённых изменений (стэшей)? +# - git stash list +# 3. Какая команда применяется для использования верхнего стэша? +# - git stash apply или git stash pop +# 4. Как применить конкретный стэш по его номеру? +# - git stash apply stash@{number} или git stash pop stash@{number} +# 5. Чем отличается команда git stash apply от git stash pop? +# - apply применяет изменения из стэша, при этом оставляя их в стэше; pop применяет изменения, удаляя их из стэша +# 6. Что делает команда git stash drop? +# - удаляет спрятанные в конкретный стэш изменения, не применяя их +# 7. Как полностью очистить все сохранённые стэши? +# - git stash clear +# 8. В каких случаях удобно использовать git stash? +# - Когда нужно срочно переключиться на другую ветку или задачу; когда нужно очистить рабочее пространство перед выполнением pull или merge; когда необходимо временно сохранить изменения, которые ещё не готовы для коммита; чтобы протестировать что-то в чистом рабочем каталоге +# 9. Что произойдёт, если выполнить git stash pop, но в проекте есть конфликтующие изменения? +# - Появится сообщение о конфликте, который необходимо будет разрешить вручную +# 10. Можно ли восстановить удалённый стэш после выполнения git stash drop? +# - Да, если не сработал сборщик мусора Git +# 11. Что делает команда git stash save "NAME_STASH" +# - Сохраняет стэш с описательным именем +# 12. Что делает команда git stash apply "NUMBER_STASH" +# - Применяет изменения конкретного стэша, оставляя изменения в стэше +# 13. Что делает команда git stash pop "NUMBER_STASH" +# - Применяет изменения конкретного стэша, удаляя изменения из стэша +# 14. Сохраните текущие изменения в стэш под названием "SENATOROV ver1", вставьте скриншот из терминала +# - ![](capture_20250908203348657.bmp) +# 15. Внесите любые изменения в ваш репозиторий и сохраните второй стэш под именем "SENATOROV ver2" +# - ![](capture_20250908203836569.bmp) +# 16. Восстановите ваш стэш "SENATOROV ver1", вставьте скриншот из терминала +# - ![](capture_20250908204438177.bmp) +# 17. Удалите все стеши из истории, вставьте скриншот из терминала +# - ![](capture_20250908204600452.bmp) diff --git a/log.ipynb b/log.ipynb index 863852e0..6e2176de 100644 --- a/log.ipynb +++ b/log.ipynb @@ -63,6 +63,16 @@ "1. Сдал первые два issue (quiz, git)\n", "2. Выполнил третий issue - commits" ] + }, + { + "cell_type": "markdown", + "id": "afb038dd", + "metadata": {}, + "source": [ + "08/09/25\n", + "\n", + "1. Выполнил четвёртый issue - stash" + ] } ], "metadata": { diff --git a/log.py b/log.py index bd19c1ad..0a343ce4 100644 --- a/log.py +++ b/log.py @@ -23,3 +23,7 @@ # # 1. Сдал первые два issue (quiz, git) # 2. Выполнил третий issue - commits + +# 08/09/25 +# +# 1. Выполнил четвёртый issue - stash From 4ceba14589293b279ed3bbbfb4e61ec3c1702504 Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Tue, 9 Sep 2025 00:02:02 +0300 Subject: [PATCH 05/14] [TASK] issues #2 (https://github.com/SENATOROVAI/intro-cs/issues/2) Closes https://github.com/SENATOROVAI/intro-cs/issues/2 --- log.ipynb | 3 +- log.py | 1 + python/issues.ipynb | 94 +++++++++++++++++++++++++++++++++++++++++++++ python/issues.py | 64 ++++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 python/issues.ipynb create mode 100644 python/issues.py diff --git a/log.ipynb b/log.ipynb index 6e2176de..44aa42cc 100644 --- a/log.ipynb +++ b/log.ipynb @@ -71,7 +71,8 @@ "source": [ "08/09/25\n", "\n", - "1. Выполнил четвёртый issue - stash" + "1. Выполнил четвёртый issue - stash\n", + "2. Выполнил пятый issue - Issues" ] } ], diff --git a/log.py b/log.py index 0a343ce4..8a0913c4 100644 --- a/log.py +++ b/log.py @@ -27,3 +27,4 @@ # 08/09/25 # # 1. Выполнил четвёртый issue - stash +# 2. Выполнил пятый issue - Issues diff --git a/python/issues.ipynb b/python/issues.ipynb new file mode 100644 index 00000000..bedbb42f --- /dev/null +++ b/python/issues.ipynb @@ -0,0 +1,94 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "27dd6347", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "\"\"\"issues.\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "dc371d0b", + "metadata": {}, + "source": [ + "# Общие вопросы\n", + "1. Что такое Issues на GitHub и для чего они используются?\n", + "- Это встроенная система отслеживания ошибок, управления задачами и обсуждения проектов\n", + "2. Чем Issues отличаются от других инструментов управления задачами?\n", + "- Отличительной чертой является интеграция с git-операциями, например, коммиты могут автоматически закрывать задачи\n", + "3. Какие основные компоненты (поля) есть у каждого Issue?\n", + "- title (заголовок), body (описание), assignees (исполнители), labels (метки), projects (проекты), milestone (дедлайны)\n", + "# Создание Issues\n", + "4. Как создать новое Issue в репозитории?\n", + "- Issues -> New issue\n", + "5. Какие данные рекомендуется указывать в описании Issue для лучшего понимания задачи?\n", + "- Рекомендуется указать проблему, шаги для её воспроизведения, ожидаемый и фактический результат, контекст\n", + "6. Какие теги (labels) можно добавить к Issue? Какие из них стандартные?\n", + "- Github позволяет создавать произвольные теги, но стандартными считаются: bug, documentation, duplicate, enhancement, good first issue, help wanted, invalid, question, wontfix\n", + "7. Как прикрепить Assignees (ответственных) к Issue?\n", + "- Необходимо выбрать участников в одноимённой вкладке во время создания issue\n", + "# Работа с Issues\n", + "8. Как использовать Labels для классификации задач?\n", + "- Labels используется для классификации задач по типам (bug, feature и т.д.), приоритетам (high, low), категориям (documentation, testing) или статусам (in progress, needs review). Это позволяет легко фильтровать issues\n", + "9. Для чего нужен Milestone, и как связать его с Issue?\n", + "- Milestone нужен для группировки Issues и Pull Requests вокруг конкретной цели версии проекта (например, \"Release 2.0\"), а связать его с issue можно в выпадающем окне \"Milestone\" в боковой панели при создании Issue \n", + "10. Как привязать Issue к пул-реквесту (Pull Request)?\n", + "- Для этого достаточно упомянуть в заголовке или описсании упомянуть номер issue с помощью ключевых слов типа Closes #X, Fixes #X, где X - номер issue\n", + "11. Как добавить комментарий к существующему Issue?\n", + "- Ввести текст в текстовое поле и нажать \"Comment\"\n", + "# Закрытие и завершение Issues\n", + "12. Как закрыть Issue вручную?\n", + "- Нажать \"Close issue\"\n", + "13. Можно ли автоматически закрыть Issue с помощью сообщения в коммите или пул-реквесте? Как это сделать?\n", + "- Да, для этого необходимо указать ключевое слово и номер issue, например Closes #123\n", + "14. Как повторно открыть закрытое Issue, если работа ещё не завершена?\n", + "- Нажать \"Reopen issue\"\n", + "# Фильтрация и поиск\n", + "15. Как найти все открытые или закрытые Issues в репозитории?\n", + "- Использовать фильтр is:open или is:closed в поиске\n", + "16. Как использовать фильтры для поиска Issues по меткам, исполнителям или другим критериям?\n", + "- Ввести критерии в поисковую строку, например, label: bug\n", + "17. Как сортировать Issues по приоритету, дате создания или другим параметрам?\n", + "- Использовать выпадающее меню \"Sort by\"\n", + "# Интеграции и автоматизация\n", + "18. Как настроить автоматические уведомления о новых или изменённых Issues?\n", + "- Через \"Watch\" -> \"Custom\" в репозитории, выбрав события для Issues\n", + "19. Что такое Projects в контексте GitHub, и как связать их с Issues?\n", + "- Projects - это канбан-доски для управления задачами. Связать issue можно через меню \"Add to project\" в боковой панели\n", + "20. Какие сторонние инструменты можно использовать для автоматизации работы с Issues (например, боты, Webhooks)?\n", + "- Боты (Github Actions), Webhooks, интеграции с Jira, Slack, Zapier\n", + "# Коллаборация\n", + "21. Как упомянуть другого пользователя в комментарии к Issue?\n", + "- С помощью \"@username\"\n", + "22. Как запросить дополнительные данные или уточнения у автора Issue?\n", + "- Оставить комментарий с вопросами, обратившись к @author\n", + "23. Что делать, если Issue неактуально или его нужно объединить с другим?\n", + "- Закрыть с меткой wontfix/duplicate или ссылкой на связанную задачу\n", + "# Практические аспекты\n", + "24. Как использовать шаблоны для создания Issues?\n", + "- Создать файлы в папке .github/ISSUE_TEMPLATE\n", + "25. Что такое Linked Issues, и как создать связь между задачами?\n", + "- Это связи между задачами, они создаются через комментарий с номером (например, #123) или меню \"Develop\" в боковой панели\n", + "26. Какие метрики (например, время выполнения) можно отслеживать с помощью Issues?\n", + "- Время закрытия, количество открытых/закрытых задач, нагрузка на исполнителей\n", + "27. Какие best practices рекомендуются при работе с Issues в команде?\n", + "- Чёткие заголовки, метки, назначение исполнителей, постановка milestone, использование шаблонов" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python/issues.py b/python/issues.py new file mode 100644 index 00000000..b2c9d28d --- /dev/null +++ b/python/issues.py @@ -0,0 +1,64 @@ +"""issues.""" + +# # Общие вопросы +# 1. Что такое Issues на GitHub и для чего они используются? +# - Это встроенная система отслеживания ошибок, управления задачами и обсуждения проектов +# 2. Чем Issues отличаются от других инструментов управления задачами? +# - Отличительной чертой является интеграция с git-операциями, например, коммиты могут автоматически закрывать задачи +# 3. Какие основные компоненты (поля) есть у каждого Issue? +# - title (заголовок), body (описание), assignees (исполнители), labels (метки), projects (проекты), milestone (дедлайны) +# # Создание Issues +# 4. Как создать новое Issue в репозитории? +# - Issues -> New issue +# 5. Какие данные рекомендуется указывать в описании Issue для лучшего понимания задачи? +# - Рекомендуется указать проблему, шаги для её воспроизведения, ожидаемый и фактический результат, контекст +# 6. Какие теги (labels) можно добавить к Issue? Какие из них стандартные? +# - Github позволяет создавать произвольные теги, но стандартными считаются: bug, documentation, duplicate, enhancement, good first issue, help wanted, invalid, question, wontfix +# 7. Как прикрепить Assignees (ответственных) к Issue? +# - Необходимо выбрать участников в одноимённой вкладке во время создания issue +# # Работа с Issues +# 8. Как использовать Labels для классификации задач? +# - Labels используется для классификации задач по типам (bug, feature и т.д.), приоритетам (high, low), категориям (documentation, testing) или статусам (in progress, needs review). Это позволяет легко фильтровать issues +# 9. Для чего нужен Milestone, и как связать его с Issue? +# - Milestone нужен для группировки Issues и Pull Requests вокруг конкретной цели версии проекта (например, "Release 2.0"), а связать его с issue можно в выпадающем окне "Milestone" в боковой панели при создании Issue +# 10. Как привязать Issue к пул-реквесту (Pull Request)? +# - Для этого достаточно упомянуть в заголовке или описсании упомянуть номер issue с помощью ключевых слов типа Closes #X, Fixes #X, где X - номер issue +# 11. Как добавить комментарий к существующему Issue? +# - Ввести текст в текстовое поле и нажать "Comment" +# # Закрытие и завершение Issues +# 12. Как закрыть Issue вручную? +# - Нажать "Close issue" +# 13. Можно ли автоматически закрыть Issue с помощью сообщения в коммите или пул-реквесте? Как это сделать? +# - Да, для этого необходимо указать ключевое слово и номер issue, например Closes #123 +# 14. Как повторно открыть закрытое Issue, если работа ещё не завершена? +# - Нажать "Reopen issue" +# # Фильтрация и поиск +# 15. Как найти все открытые или закрытые Issues в репозитории? +# - Использовать фильтр is:open или is:closed в поиске +# 16. Как использовать фильтры для поиска Issues по меткам, исполнителям или другим критериям? +# - Ввести критерии в поисковую строку, например, label: bug +# 17. Как сортировать Issues по приоритету, дате создания или другим параметрам? +# - Использовать выпадающее меню "Sort by" +# # Интеграции и автоматизация +# 18. Как настроить автоматические уведомления о новых или изменённых Issues? +# - Через "Watch" -> "Custom" в репозитории, выбрав события для Issues +# 19. Что такое Projects в контексте GitHub, и как связать их с Issues? +# - Projects - это канбан-доски для управления задачами. Связать issue можно через меню "Add to project" в боковой панели +# 20. Какие сторонние инструменты можно использовать для автоматизации работы с Issues (например, боты, Webhooks)? +# - Боты (Github Actions), Webhooks, интеграции с Jira, Slack, Zapier +# # Коллаборация +# 21. Как упомянуть другого пользователя в комментарии к Issue? +# - С помощью "@username" +# 22. Как запросить дополнительные данные или уточнения у автора Issue? +# - Оставить комментарий с вопросами, обратившись к @author +# 23. Что делать, если Issue неактуально или его нужно объединить с другим? +# - Закрыть с меткой wontfix/duplicate или ссылкой на связанную задачу +# # Практические аспекты +# 24. Как использовать шаблоны для создания Issues? +# - Создать файлы в папке .github/ISSUE_TEMPLATE +# 25. Что такое Linked Issues, и как создать связь между задачами? +# - Это связи между задачами, они создаются через комментарий с номером (например, #123) или меню "Develop" в боковой панели +# 26. Какие метрики (например, время выполнения) можно отслеживать с помощью Issues? +# - Время закрытия, количество открытых/закрытых задач, нагрузка на исполнителей +# 27. Какие best practices рекомендуются при работе с Issues в команде? +# - Чёткие заголовки, метки, назначение исполнителей, постановка milestone, использование шаблонов From 870fbee91fc9b2b5a7678368db843f3ebbc02624 Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Wed, 10 Sep 2025 22:20:47 +0300 Subject: [PATCH 06/14] =?UTF-8?q?[TASK]=20=D0=92=D0=B8=D1=80=D1=82=D1=83?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D0=BE=D0=BA=D1=80=D1=83?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=20#7=20(https://github.com/SE?= =?UTF-8?q?NATOROVAI/intro-cs/issues/7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://github.com/SENATOROVAI/intro-cs/issues/7 --- .gitignore | 1 + python/venv.ipynb | 75 +++++++++++++++++++++++++++++++++++++++++++++++ python/venv.py | 45 ++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 python/venv.ipynb create mode 100644 python/venv.py diff --git a/.gitignore b/.gitignore index 0fa2f447..f25a8418 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +SENATOROV/ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/python/venv.ipynb b/python/venv.ipynb new file mode 100644 index 00000000..5c180d8f --- /dev/null +++ b/python/venv.ipynb @@ -0,0 +1,75 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "06f285be", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "\"\"\"venv.\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "5fffad32", + "metadata": {}, + "source": [ + "1. Что делает команда python -m venv venv?\n", + "- Создаёт виртуальное окружение с именем 'venv'\n", + "1.1 Что делает каждая команда в списке ниже?\n", + "- pip list - Выводит список зависимостей \n", + "- pip freeze > requirements.txt - Сохраняет существующие зависимости в файл requirements.txt\n", + "- pip install -r requirements.txt - Устанавливает все зависимости, содержащиеся в файле requirements.txt\n", + "2. Что делает каждая команда в списке ниже?\n", + "- conda env list - Выводит список всех окружений conda\n", + "- conda create -n env_name python=3.5 - Создаёт виртуальное окружение с именем env_name и версией Python 3.5\n", + "- conda env update -n env_name -f file.yml - Обновляет окружение env_name из yaml-файла\n", + "- source activate env_name - Активирует виртуальное окружение env_name\n", + "- source deactivate - Деактивирует окружение\n", + "- conda clean -a - удаляет неиспользуемые пакеты и кэш\n", + "3. вставьте скрин вашего терминала, где вы активировали сначала venv, потом conda, назовите окружение \"SENATOROV\"\n", + "- ![](capture_20250910213711867.bmp)\n", + "- ![](capture_20250910215309379.bmp)\n", + "![](capture_20250910215201634.bmp)\n", + "4. Как установить необходимые пакеты внутрь виртуального окружения для conda/venv?\n", + "- conda install package_name или conda env update -f environment.yml или с помощью интерфейса в Anaconda Navigator\n", + "5. Что делают эти команды?\n", + "- pip freeze > requirements.txt - Сохраняет существующие зависимости в файл requirements.txt\n", + "- conda env export > environment.yml - Экспортирует окружение conda в yaml-файл\n", + "5.1 вставьте скрин, где будет видна папка VENV в вашем репозитории а также файлы зависимостей requirements.txt и environment.yml, файлы должны содержать зависимости\n", + "- ![](capture_20250910220332317.bmp)\n", + "6. Что делают эти команды?\n", + "- pip install -r requirements.txt - Устанавливает все зависимости из файла requirements.txt\n", + "- conda env create -f environment.yml - Создаёт окружение из yaml-файла\n", + "7. Что делают эти команды?\n", + "- pip list - Выводит список установленных пакетов\n", + "- pip show - Выводит информацию о пакете\n", + "- conda list - Выводит список пакетов в окружении conda\n", + "8. Где по умолчанию больше пакетов venv/pip или conda? и почему дата сайентисты используют conda?\n", + "- По умолчанию больше пакетов в conda. Дата сайентисты используют conda из-за большого количества предустановленных необходимых пакетов и из-за удобства управления средами\n", + "9. вставьте скрин где будет видно, Выбор интерпретатора Python (conda) в VS Code/cursor\n", + "- ![](capture_20250910220952281.bmp)\n", + "10. добавьте в .gitignore папку SENATOROV\n", + "- Добавил\n", + "11. Зачем нужно виртуально окружение?\n", + "- Виртуальное окружение нужно для изоляции зависимостей проекта, чтобы избежать конфликтов версий пакетов\n", + "12. С этого момента надо работать в виртуальном окружении conda, ты научился(-ась) выгружать зависимости и работать с окружением?\n", + "- Да\n", + "13. Удалите папку VENV, она больше не нужна, мы же не разрабы, нам нужна только conda\n", + "- Удалил" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python/venv.py b/python/venv.py new file mode 100644 index 00000000..20c7d578 --- /dev/null +++ b/python/venv.py @@ -0,0 +1,45 @@ +"""venv.""" + +# 1. Что делает команда python -m venv venv? +# - Создаёт виртуальное окружение с именем 'venv' +# 1.1 Что делает каждая команда в списке ниже? +# - pip list - Выводит список зависимостей +# - pip freeze > requirements.txt - Сохраняет существующие зависимости в файл requirements.txt +# - pip install -r requirements.txt - Устанавливает все зависимости, содержащиеся в файле requirements.txt +# 2. Что делает каждая команда в списке ниже? +# - conda env list - Выводит список всех окружений conda +# - conda create -n env_name python=3.5 - Создаёт виртуальное окружение с именем env_name и версией Python 3.5 +# - conda env update -n env_name -f file.yml - Обновляет окружение env_name из yaml-файла +# - source activate env_name - Активирует виртуальное окружение env_name +# - source deactivate - Деактивирует окружение +# - conda clean -a - удаляет неиспользуемые пакеты и кэш +# 3. вставьте скрин вашего терминала, где вы активировали сначала venv, потом conda, назовите окружение "SENATOROV" +# - ![](capture_20250910213711867.bmp) +# - ![](capture_20250910215309379.bmp) +# ![](capture_20250910215201634.bmp) +# 4. Как установить необходимые пакеты внутрь виртуального окружения для conda/venv? +# - conda install package_name или conda env update -f environment.yml или с помощью интерфейса в Anaconda Navigator +# 5. Что делают эти команды? +# - pip freeze > requirements.txt - Сохраняет существующие зависимости в файл requirements.txt +# - conda env export > environment.yml - Экспортирует окружение conda в yaml-файл +# 5.1 вставьте скрин, где будет видна папка VENV в вашем репозитории а также файлы зависимостей requirements.txt и environment.yml, файлы должны содержать зависимости +# - ![](capture_20250910220332317.bmp) +# 6. Что делают эти команды? +# - pip install -r requirements.txt - Устанавливает все зависимости из файла requirements.txt +# - conda env create -f environment.yml - Создаёт окружение из yaml-файла +# 7. Что делают эти команды? +# - pip list - Выводит список установленных пакетов +# - pip show - Выводит информацию о пакете +# - conda list - Выводит список пакетов в окружении conda +# 8. Где по умолчанию больше пакетов venv/pip или conda? и почему дата сайентисты используют conda? +# - По умолчанию больше пакетов в conda. Дата сайентисты используют conda из-за большого количества предустановленных необходимых пакетов и из-за удобства управления средами +# 9. вставьте скрин где будет видно, Выбор интерпретатора Python (conda) в VS Code/cursor +# - ![](capture_20250910220952281.bmp) +# 10. добавьте в .gitignore папку SENATOROV +# - Добавил +# 11. Зачем нужно виртуально окружение? +# - Виртуальное окружение нужно для изоляции зависимостей проекта, чтобы избежать конфликтов версий пакетов +# 12. С этого момента надо работать в виртуальном окружении conda, ты научился(-ась) выгружать зависимости и работать с окружением? +# - Да +# 13. Удалите папку VENV, она больше не нужна, мы же не разрабы, нам нужна только conda +# - Удалил From 51b5c7ae833f02d1a701678a611f3de81b6e4fe4 Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Sun, 14 Sep 2025 16:47:55 +0300 Subject: [PATCH 07/14] UPDATE README (#366) Closes #366 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index edcf18ea..8be15ce6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # Data-Science-For-Beginners-from-scratch-SENATOROV Командный репозиторий. + +### Telegram: https://t.me/RuslanSenatorov \ No newline at end of file From e43a84ccb20f041b5aac82b7c8da629f88cb4a0a Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Sun, 14 Sep 2025 22:45:21 +0300 Subject: [PATCH 08/14] =?UTF-8?q?[TASK]=20=D0=9A=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=B8=D0=B1=D1=8C=D1=8E=D1=82=D0=B8=D0=BD=D0=B3=20=D0=B2=20Ope?= =?UTF-8?q?n=20Source=20=20#8=20(https://github.com/SENATOROVAI/intro-cs/i?= =?UTF-8?q?ssues/8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://github.com/SENATOROVAI/intro-cs/issues/8 --- github/opensource.ipynb | 70 ++++++++++++++++ github/opensource.py | 41 ++++++++++ github/quiz.ipynb | 175 ++++++++++++++++++++++++++++++++++++++++ github/quiz.py | 142 ++++++++++++++++++++++++++++++++ 4 files changed, 428 insertions(+) create mode 100644 github/opensource.ipynb create mode 100644 github/opensource.py create mode 100644 github/quiz.ipynb create mode 100644 github/quiz.py diff --git a/github/opensource.ipynb b/github/opensource.ipynb new file mode 100644 index 00000000..fbf88e72 --- /dev/null +++ b/github/opensource.ipynb @@ -0,0 +1,70 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "fe9275e1", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "\"\"\"opensource.\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "152a3546", + "metadata": {}, + "source": [ + "# Проект в который вы отправили пул реквест, попадает под определение опенсорса:\n", + "\n", + "1. Есть ли у него лицензия? Обычно в корне репозитория находится файл LICENSE.\n", + "- Да\n", + "2. Напишите название понравившейся компании и ссылку на репозиторий\n", + "- Google, https://github.com/google/ml-edu\n", + "3. Проект активно принимает стороннюю помощь?\n", + "- Не очень, у данного репозитория всего 11 пул реквестов\n", + "4. Напишите второе улучшение которое вы сделали\n", + "- Обновил README, сделал его более информативным и содержательным\n", + "5. Посмотрите на коммиты в основной ветке, напишите общее количество\n", + "- 11\n", + "6. Когда был последний коммит?\n", + "- 2 месяца назад\n", + "7. Сколько контрибьюторов у проекта?\n", + "- 2\n", + "8. Как часто люди коммитят в репозиторий? (На GitHub выяснить это можно, кликнув по ссылке «Commits» в верхней панели.)\n", + "- В среднем раз в 2-3 месяца\n", + "9. Сколько сейчас открытых ишью?\n", + "- 2\n", + "10. Быстро ли мейнтейнеры реагируют на ишью после того, когда они открываются?\n", + "- Нет\n", + "11. Ведётся ли активное обсуждение ишью?\n", + "- Нет\n", + "12. Есть ли недавно созданные ишью?\n", + "- Нет\n", + "13. Есть ли закрытые ишью? (На странице Issues GitHub-репозитория щелкните на вкладку «Closed», чтобы увидеть закрытые ишью.)\n", + "- Нет\n", + "14. Сколько сейчас открытых пул-реквестов?\n", + "- 2\n", + "15. Быстро ли мейнтейнеры реагируют на пул-реквесты после их открытия?\n", + "- Да\n", + "16. Ведётся ли активное обсуждение пул-реквестов?\n", + "- Нет\n", + "17. Есть ли недавно отправленные пул-реквесты?\n", + "- Да\n", + "18. Как давно были объединены пул-реквесты? (На странице Pull Request GitHub-репозитория щелкните на вкладку «Closed», чтобы увидеть закрытые пул-реквесты.)\n", + "- Месяц назад\n" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/github/opensource.py b/github/opensource.py new file mode 100644 index 00000000..a5b1b123 --- /dev/null +++ b/github/opensource.py @@ -0,0 +1,41 @@ +"""opensource.""" + +# # Проект в который вы отправили пул реквест, попадает под определение опенсорса: +# +# 1. Есть ли у него лицензия? Обычно в корне репозитория находится файл LICENSE. +# - Да +# 2. Напишите название понравившейся компании и ссылку на репозиторий +# - Google, https://github.com/google/ml-edu +# 3. Проект активно принимает стороннюю помощь? +# - Не очень, у данного репозитория всего 11 пул реквестов +# 4. Напишите второе улучшение которое вы сделали +# - Обновил README, сделал его более информативным и содержательным +# 5. Посмотрите на коммиты в основной ветке, напишите общее количество +# - 11 +# 6. Когда был последний коммит? +# - 2 месяца назад +# 7. Сколько контрибьюторов у проекта? +# - 2 +# 8. Как часто люди коммитят в репозиторий? (На GitHub выяснить это можно, кликнув по ссылке «Commits» в верхней панели.) +# - В среднем раз в 2-3 месяца +# 9. Сколько сейчас открытых ишью? +# - 2 +# 10. Быстро ли мейнтейнеры реагируют на ишью после того, когда они открываются? +# - Нет +# 11. Ведётся ли активное обсуждение ишью? +# - Нет +# 12. Есть ли недавно созданные ишью? +# - Нет +# 13. Есть ли закрытые ишью? (На странице Issues GitHub-репозитория щелкните на вкладку «Closed», чтобы увидеть закрытые ишью.) +# - Нет +# 14. Сколько сейчас открытых пул-реквестов? +# - 2 +# 15. Быстро ли мейнтейнеры реагируют на пул-реквесты после их открытия? +# - Да +# 16. Ведётся ли активное обсуждение пул-реквестов? +# - Нет +# 17. Есть ли недавно отправленные пул-реквесты? +# - Да +# 18. Как давно были объединены пул-реквесты? (На странице Pull Request GitHub-репозитория щелкните на вкладку «Closed», чтобы увидеть закрытые пул-реквесты.) +# - Месяц назад +# diff --git a/github/quiz.ipynb b/github/quiz.ipynb new file mode 100644 index 00000000..85645dbe --- /dev/null +++ b/github/quiz.ipynb @@ -0,0 +1,175 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0c46e65b", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "\"\"\"github.\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "2fb1afe2", + "metadata": {}, + "source": [ + "1.1. Что такое GitHub?\n", + "- Это крупнейшее хранилище Git репозиториев, а также центр сотрудничества для миллионов разработчиков и проектов\n", + "1.2. Как GitHub связан с Git?\n", + "- GitHub - это облачный хостинг и веб-интерфейс для работы с репозиториями Git\n", + "1.3. Чем отличается fork репозитория от его клонирования (clone)?\n", + "- Fork - создание собственной копии чужого репозитория на GitHub, clone - скачивание репозитория с GitHub на компьютер\n", + "1.4. Зачем нужны и как работают pull requests?\n", + "- Для предложения изменений в чужой репозиторий. Автор делает fork, вносит изменения в свою копию, затем через PR предлагает владельцу оригинального репозитория принять эти изменения\n", + "1.5. GitHub использует ваш почтовый адрес для привязки ваших Git коммитов к вашей учётной записи?\n", + "- Да, при условии, что email в настройках Git на локальной машине совпадает с email, привязанным к Github\n", + "1.6 Какая команда генерирует SSH ключ для Доступа по SSH к репозиторию (Рисунок 83)\n", + "- ssh-keygen -o\n", + "\n", + "\n", + "# Внесение собственного вклада в проекты\n", + "2. Создайте ишьюс и запомните его номер, в https://github.com/SENATOROVAI/Data-Science-For-Beginners-from-scratch-SENATOROV/issues, назовите его \"UPDATE README\", в дескрипшене добавьте список задач (Рисунок 102)\n", + "- Сделал issue \\#366\n", + "\n", + "2.1. Если вы хотите вносить свой вклад в уже существующие проекты, в которых у нас нет прав на внесения изменений путём отправки (push) изменений, вы можете создать своё собственное ответвление, что нужно сделать чтобы создать собственное ответвление? (Рисунок 88), сделайте ответвление https://github.com/SENATOROVAI/Data-Science-For-Beginners-from-scratch-SENATOROV, и вставьте сюда ссылку на ваше ответвление\n", + "- Чтобы сделать своё ответвление, нужно нажать 'Fork'. Ссылка на моё ответвление: https://github.com/smrnvdn/Data-Science-For-Beginners-from-scratch-SENATOROV\n", + "\n", + "2.2 создайте ветку dev в ФОРКЕ Data-Science-For-Beginners, вставьте сюда ссылку на вашу ветку dev\n", + "- https://github.com/smrnvdn/Data-Science-For-Beginners-from-scratch-SENATOROV/tree/dev\n", + "\n", + "2.3 В README файле вашего ФОРКА, добавьте ссылку на мой телеграм канал https://t.me/RuslanSenatorov, сохраните коммит, название коммита - в тайтле название ишьюса (#номер_ишьюс), в дескрипшене - Closes #NUMBER-ISSUES номер возьмите из пункта 2\n", + "\n", + "- Ссылка на коммит: https://github.com/smrnvdn/Data-Science-For-Beginners-from-scratch-SENATOROV/commit/51b5c7ae833f02d1a701678a611f3de81b6e4fe4\n", + "\n", + "2.4 Отправьте пул реквест из ФОРКА в основу В ВАШУ ВЕТКУ, тайтл пул реквеста скопируйте из ISSUES-TITLE, в дескрипшине пул реквеста напишите Closes #NUMBER-ISSUES вставьте номер из пункта 2\n", + "- Сделал\n", + "\n", + "2.5 Прокомментириуйте ваш пул реквест перед слиянием, перейдите во вкладку(Рисунок 92) и напишите \"ок\", потом нажимайте сабмит ревью затем не выходя из этой вкладки, в файле README , добавьте туда ссылку на https://t.me/SENATOROVAI\n", + "- Сделал\n", + "\n", + "2.6 Выполните Merge pull request (Рисунок 116), вставьте сюда ссылку на ваш пул реквест\n", + "- Ссылка на PR: https://github.com/smrnvdn/Data-Science-For-Beginners-from-scratch-SENATOROV/pull/1\n", + "\n", + "2.7 Вставьте сюда ссылку на закрытые пул реквесты в репозитории, найти можно тут\n", + "- https://github.com/SENATOROVAI/Data-Science-For-Beginners-from-scratch-SENATOROV/pulls?q=is%3Apr+is%3Aclosed\n", + "\n", + "2.8 Как посмотреть какие файлы были в репозитории на момент определенного коммита? вставьте сюда ссылку на любой коммит, где взять ссылку? \n", + "- Чтобы посмотреть, какие файлы были в репозитории на момент определённого коммита, надо выбрать нужный коммит и нажать на 'Browse files'.\n", + "- Ссылка на коммит: https://github.com/smrnvdn/Data-Science-For-Beginners-from-scratch-SENATOROV/tree/acb60ca6109f4a0ed7ce2f309a9ceebcf557f8d7\n", + "\n", + "2.9 как открыть запрос слияния, указывающий на другой запрос слияния и зачем это нужно? (Рисунок 117)\n", + "- Если вы видите толковый запрос слияния и у вас есть идея как его улучшить или вы не уверены, что это хорошая идея, или у вас просто нет прав записи в целевую ветку, то в таком случае вы можете открыть запрос слияния, указывающий на данный запрос.\n", + "При открытии запроса на слияние вверху страницы вы увидите меню для выбора целевой и исходной веток. Если нажать кнопку Edit справа, то станет доступным выбор не только исходной ветки, а ещё и форка. Здесь можно указать вашу новую ветку для слияния с другим запросом слияния или другим форком проекта.\n", + "\n", + "# Рабочий процесс с использованием GitHub\n", + "3 Напишите 8 пунктов, которые нужно сделать, чтобы внести вклад в чужой проект.\n", + "- 1. Создать форк проекта\n", + "- 2. Создать тематическую ветку на основе ветки master/main\n", + "- 3. Внести и закоммитить изменения\n", + "- 4. Запушить ветку на Github\n", + "- 5. Создать запрос на слияние\n", + "- 6. Обсудить с владельцем репозитория/ревьюером внесённые изменения\n", + "- 7. Дождаться принятия или отклонения своих изменений\n", + "- 8. В случае принятия обновить свой форк\n", + "\n", + "3.1.\n", + "\n", + "Какие практики принято соблюдать при создании Pull Request чтобы закрыть автоматический issues?\n", + "- В тайтле PR указывается ссылка/номер ишью, в описании используются ключевые слова с номером ишью (например, Closes \\#123, Fixes \\#123)\n", + "\n", + "Какие практики принято соблюдать при создании commit чтобы закрыть автоматический issues?\n", + "- Правила те же, что и для PR, важно только помнить, что сам по себе коммит с ключевым словом, отправленный в свою feature-ветку, не закроет ишью. Ишью закроется только в тот момент, когда коммит, содержащий ключевое слово, попадёт в целевую ветку через операцию слияния\n", + "\n", + "3.2 Как отклонить/закрыть пул реквест? (предоставьте скриншот где это в гитхабе)\n", + "- Перейти на вкладку Pull Requests в репозитории, выбрать PR, внизу открывшейся страницы будет кнопка 'Close pull request'\n", + "\n", + "3.3 Перед отправкой пул реквеста нужно ли создавать ишьюс?\n", + "- В большинстве случаев желательно создать ишью, но не всегда\n", + "\n", + "3.4 В какой вкладке можно посмотреть список изменений который был в пул реквесте? (Рисунок 92)\n", + "- Files changed\n", + "\n", + "3.5 В какой вкладке находится страница обсуждений пул реквеста? (Рисунок 94)\n", + "- Conversation\n", + "\n", + "# Создание запроса на слияние\n", + "4 Можно ли открыть пул реквест, если вы ничего не вносили в FORK?\n", + "- Нельзя, суть пулл реквеста в отображении разницы между кодом в форке и оригинальном репозитории\n", + "\n", + "4.1 Что нужно сделать чтобы открыть пул реквест? (Рисунок 90)\n", + "- Внести изменения в своём форке, закоммитить и запушить изменения, нажать Compare & pull request\n", + "\n", + "4.2 Что нужно сделать Если ваш Форк устарел?\n", + "- Нажать Sync fork\n", + "\n", + "4.3 Что нужно сделать если в пул реквесте имеются конфликты слияния (Рисунок 96)\n", + "- Существует два основных варианта исключить конфликты. Вы можете либо перебазировать свою ветку относительно целевой ветки (обычно, относительно master/main), либо слить целевую ветку в свою.\n", + "Большинство разработчиков на GitHub выбирают последний вариант, поскольку важна история и окончательное слияние, а перебазирование не принесёт ничего, кроме немного более чистой истории, при этом оно гораздо сложнее и может стать источником ошибок.\n", + "\n", + "# Отрывки кода\n", + "5 Что нужно сделать Для добавления отрывка кода в комментарии к ишьюсу? (Рисунок 104)\n", + "- Для добавления отрывка кода следует обрамить его обратными кавычками\n", + "\n", + "5.1 На какую клавишу нажать клавишу чтобы выделенный текст был включён как цитата в ваш комментарий?(Рисунок 105)\n", + "- r\n", + "\n", + "5.2 Как вставить картинку в ишьюс? (Рисунок 108)\n", + "- 'Вставить' или просто перетащить картинку в окно комментария, также можно воспользоваться шаблоном Markdown \\!\\[описание\\]\\(ссылка\\)\n", + "\n", + "# Поддержание GitHub репозитория в актуальном состоянии\n", + "6 Как понять что ваш форк устарел?\n", + "- В GitHub тобразится сообщение 'This branch is behind main by X commits'\n", + "\n", + "6.1 Как обновить форк?\n", + "- Нажать Sync fork\n", + "\n", + "# Добавление участников\n", + "7 Как добавить участников в ваш репозиторий, чтобы команда могла работать над одним репозиторием? (Рисунок 112)\n", + "- Settings -> Collaborators -> Add collaborator\n", + "\n", + "# Упоминания и уведомления\n", + "8 Какой символ нужен для упоминания кого-либо? (Рисунок 118)\n", + "- @\n", + "\n", + "8.1 Где находится Центр уведомлений, напишите ссылку (Рисунок 121)\n", + "- https://github.com/notifications\n", + "\n", + "# Особенные файлы\n", + "9 Что такое и зачем нужен файл README\n", + "- Это файл-визитка проекта: объясняет суть проекта, даёт основные инструкции, показывает примеры кода и его работы\n", + "\n", + "9.1 Что такое и зачем нужен файл CONTRIBUTING (Рисунок 122)\n", + "- Если в вашем репозитории будет файл CONTRIBUTING с любым расширением, то GitHub будет показывать ссылку на него при создании любого запроса на слияние. Идея состоит в том, что вы можете указать конкретные вещи, которые вы хотите или не хотите видеть в новых запросах на слияние. Таким образом люди могут ознакомится с руководством, перед тем как создавать новый запрос на слияние.\n", + "\n", + "# Управление проектом\n", + "10 Как измененить основную ветку (Рисунок 123)\n", + "- Settings -> General -> Default branch\n", + "\n", + "10. 1 Как передать проект? какая кнопка? (рисунок 124)\n", + "- Transfer ownership\n", + "\n", + "10.2 Что такое файл .gitignore?\n", + "- Это конфигурационный файл для Git, который указывает, какие файлы и папки не нужно отслеживать и добавлять в репозиторий\n" + ] + }, + { + "cell_type": "markdown", + "id": "906416a1", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/github/quiz.py b/github/quiz.py new file mode 100644 index 00000000..f56af3e9 --- /dev/null +++ b/github/quiz.py @@ -0,0 +1,142 @@ +"""github.""" + +# 1.1. Что такое GitHub? +# - Это крупнейшее хранилище Git репозиториев, а также центр сотрудничества для миллионов разработчиков и проектов +# 1.2. Как GitHub связан с Git? +# - GitHub - это облачный хостинг и веб-интерфейс для работы с репозиториями Git +# 1.3. Чем отличается fork репозитория от его клонирования (clone)? +# - Fork - создание собственной копии чужого репозитория на GitHub, clone - скачивание репозитория с GitHub на компьютер +# 1.4. Зачем нужны и как работают pull requests? +# - Для предложения изменений в чужой репозиторий. Автор делает fork, вносит изменения в свою копию, затем через PR предлагает владельцу оригинального репозитория принять эти изменения +# 1.5. GitHub использует ваш почтовый адрес для привязки ваших Git коммитов к вашей учётной записи? +# - Да, при условии, что email в настройках Git на локальной машине совпадает с email, привязанным к Github +# 1.6 Какая команда генерирует SSH ключ для Доступа по SSH к репозиторию (Рисунок 83) +# - ssh-keygen -o +# +# +# # Внесение собственного вклада в проекты +# 2. Создайте ишьюс и запомните его номер, в https://github.com/SENATOROVAI/Data-Science-For-Beginners-from-scratch-SENATOROV/issues, назовите его "UPDATE README", в дескрипшене добавьте список задач (Рисунок 102) +# - Сделал issue \#366 +# +# 2.1. Если вы хотите вносить свой вклад в уже существующие проекты, в которых у нас нет прав на внесения изменений путём отправки (push) изменений, вы можете создать своё собственное ответвление, что нужно сделать чтобы создать собственное ответвление? (Рисунок 88), сделайте ответвление https://github.com/SENATOROVAI/Data-Science-For-Beginners-from-scratch-SENATOROV, и вставьте сюда ссылку на ваше ответвление +# - Чтобы сделать своё ответвление, нужно нажать 'Fork'. Ссылка на моё ответвление: https://github.com/smrnvdn/Data-Science-For-Beginners-from-scratch-SENATOROV +# +# 2.2 создайте ветку dev в ФОРКЕ Data-Science-For-Beginners, вставьте сюда ссылку на вашу ветку dev +# - https://github.com/smrnvdn/Data-Science-For-Beginners-from-scratch-SENATOROV/tree/dev +# +# 2.3 В README файле вашего ФОРКА, добавьте ссылку на мой телеграм канал https://t.me/RuslanSenatorov, сохраните коммит, название коммита - в тайтле название ишьюса (#номер_ишьюс), в дескрипшене - Closes #NUMBER-ISSUES номер возьмите из пункта 2 +# +# - Ссылка на коммит: https://github.com/smrnvdn/Data-Science-For-Beginners-from-scratch-SENATOROV/commit/51b5c7ae833f02d1a701678a611f3de81b6e4fe4 +# +# 2.4 Отправьте пул реквест из ФОРКА в основу В ВАШУ ВЕТКУ, тайтл пул реквеста скопируйте из ISSUES-TITLE, в дескрипшине пул реквеста напишите Closes #NUMBER-ISSUES вставьте номер из пункта 2 +# - Сделал +# +# 2.5 Прокомментириуйте ваш пул реквест перед слиянием, перейдите во вкладку(Рисунок 92) и напишите "ок", потом нажимайте сабмит ревью затем не выходя из этой вкладки, в файле README , добавьте туда ссылку на https://t.me/SENATOROVAI +# - Сделал +# +# 2.6 Выполните Merge pull request (Рисунок 116), вставьте сюда ссылку на ваш пул реквест +# - Ссылка на PR: https://github.com/smrnvdn/Data-Science-For-Beginners-from-scratch-SENATOROV/pull/1 +# +# 2.7 Вставьте сюда ссылку на закрытые пул реквесты в репозитории, найти можно тут +# - https://github.com/SENATOROVAI/Data-Science-For-Beginners-from-scratch-SENATOROV/pulls?q=is%3Apr+is%3Aclosed +# +# 2.8 Как посмотреть какие файлы были в репозитории на момент определенного коммита? вставьте сюда ссылку на любой коммит, где взять ссылку? +# - Чтобы посмотреть, какие файлы были в репозитории на момент определённого коммита, надо выбрать нужный коммит и нажать на 'Browse files'. +# - Ссылка на коммит: https://github.com/smrnvdn/Data-Science-For-Beginners-from-scratch-SENATOROV/tree/acb60ca6109f4a0ed7ce2f309a9ceebcf557f8d7 +# +# 2.9 как открыть запрос слияния, указывающий на другой запрос слияния и зачем это нужно? (Рисунок 117) +# - Если вы видите толковый запрос слияния и у вас есть идея как его улучшить или вы не уверены, что это хорошая идея, или у вас просто нет прав записи в целевую ветку, то в таком случае вы можете открыть запрос слияния, указывающий на данный запрос. +# При открытии запроса на слияние вверху страницы вы увидите меню для выбора целевой и исходной веток. Если нажать кнопку Edit справа, то станет доступным выбор не только исходной ветки, а ещё и форка. Здесь можно указать вашу новую ветку для слияния с другим запросом слияния или другим форком проекта. +# +# # Рабочий процесс с использованием GitHub +# 3 Напишите 8 пунктов, которые нужно сделать, чтобы внести вклад в чужой проект. +# - 1. Создать форк проекта +# - 2. Создать тематическую ветку на основе ветки master/main +# - 3. Внести и закоммитить изменения +# - 4. Запушить ветку на Github +# - 5. Создать запрос на слияние +# - 6. Обсудить с владельцем репозитория/ревьюером внесённые изменения +# - 7. Дождаться принятия или отклонения своих изменений +# - 8. В случае принятия обновить свой форк +# +# 3.1. +# +# Какие практики принято соблюдать при создании Pull Request чтобы закрыть автоматический issues? +# - В тайтле PR указывается ссылка/номер ишью, в описании используются ключевые слова с номером ишью (например, Closes \#123, Fixes \#123) +# +# Какие практики принято соблюдать при создании commit чтобы закрыть автоматический issues? +# - Правила те же, что и для PR, важно только помнить, что сам по себе коммит с ключевым словом, отправленный в свою feature-ветку, не закроет ишью. Ишью закроется только в тот момент, когда коммит, содержащий ключевое слово, попадёт в целевую ветку через операцию слияния +# +# 3.2 Как отклонить/закрыть пул реквест? (предоставьте скриншот где это в гитхабе) +# - Перейти на вкладку Pull Requests в репозитории, выбрать PR, внизу открывшейся страницы будет кнопка 'Close pull request' +# +# 3.3 Перед отправкой пул реквеста нужно ли создавать ишьюс? +# - В большинстве случаев желательно создать ишью, но не всегда +# +# 3.4 В какой вкладке можно посмотреть список изменений который был в пул реквесте? (Рисунок 92) +# - Files changed +# +# 3.5 В какой вкладке находится страница обсуждений пул реквеста? (Рисунок 94) +# - Conversation +# +# # Создание запроса на слияние +# 4 Можно ли открыть пул реквест, если вы ничего не вносили в FORK? +# - Нельзя, суть пулл реквеста в отображении разницы между кодом в форке и оригинальном репозитории +# +# 4.1 Что нужно сделать чтобы открыть пул реквест? (Рисунок 90) +# - Внести изменения в своём форке, закоммитить и запушить изменения, нажать Compare & pull request +# +# 4.2 Что нужно сделать Если ваш Форк устарел? +# - Нажать Sync fork +# +# 4.3 Что нужно сделать если в пул реквесте имеются конфликты слияния (Рисунок 96) +# - Существует два основных варианта исключить конфликты. Вы можете либо перебазировать свою ветку относительно целевой ветки (обычно, относительно master/main), либо слить целевую ветку в свою. +# Большинство разработчиков на GitHub выбирают последний вариант, поскольку важна история и окончательное слияние, а перебазирование не принесёт ничего, кроме немного более чистой истории, при этом оно гораздо сложнее и может стать источником ошибок. +# +# # Отрывки кода +# 5 Что нужно сделать Для добавления отрывка кода в комментарии к ишьюсу? (Рисунок 104) +# - Для добавления отрывка кода следует обрамить его обратными кавычками +# +# 5.1 На какую клавишу нажать клавишу чтобы выделенный текст был включён как цитата в ваш комментарий?(Рисунок 105) +# - r +# +# 5.2 Как вставить картинку в ишьюс? (Рисунок 108) +# - 'Вставить' или просто перетащить картинку в окно комментария, также можно воспользоваться шаблоном Markdown \!\[описание\]\(ссылка\) +# +# # Поддержание GitHub репозитория в актуальном состоянии +# 6 Как понять что ваш форк устарел? +# - В GitHub тобразится сообщение 'This branch is behind main by X commits' +# +# 6.1 Как обновить форк? +# - Нажать Sync fork +# +# # Добавление участников +# 7 Как добавить участников в ваш репозиторий, чтобы команда могла работать над одним репозиторием? (Рисунок 112) +# - Settings -> Collaborators -> Add collaborator +# +# # Упоминания и уведомления +# 8 Какой символ нужен для упоминания кого-либо? (Рисунок 118) +# - @ +# +# 8.1 Где находится Центр уведомлений, напишите ссылку (Рисунок 121) +# - https://github.com/notifications +# +# # Особенные файлы +# 9 Что такое и зачем нужен файл README +# - Это файл-визитка проекта: объясняет суть проекта, даёт основные инструкции, показывает примеры кода и его работы +# +# 9.1 Что такое и зачем нужен файл CONTRIBUTING (Рисунок 122) +# - Если в вашем репозитории будет файл CONTRIBUTING с любым расширением, то GitHub будет показывать ссылку на него при создании любого запроса на слияние. Идея состоит в том, что вы можете указать конкретные вещи, которые вы хотите или не хотите видеть в новых запросах на слияние. Таким образом люди могут ознакомится с руководством, перед тем как создавать новый запрос на слияние. +# +# # Управление проектом +# 10 Как измененить основную ветку (Рисунок 123) +# - Settings -> General -> Default branch +# +# 10. 1 Как передать проект? какая кнопка? (рисунок 124) +# - Transfer ownership +# +# 10.2 Что такое файл .gitignore? +# - Это конфигурационный файл для Git, который указывает, какие файлы и папки не нужно отслеживать и добавлять в репозиторий +# + +# From 3ea637943cd7fc8b61c88de82ed48daf03a338b0 Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Mon, 15 Sep 2025 00:28:06 +0300 Subject: [PATCH 09/14] [TASK] Cpython #4 (https://github.com/SENATOROVAI/intro-cs/issues/4) Closes https://github.com/SENATOROVAI/intro-cs/issues/4 --- python/cpython.ipynb | 151 +++++++++++++++++++++++++++++++++++++++++++ python/cpython.py | 116 +++++++++++++++++++++++++++++++++ 2 files changed, 267 insertions(+) create mode 100644 python/cpython.ipynb create mode 100644 python/cpython.py diff --git a/python/cpython.ipynb b/python/cpython.ipynb new file mode 100644 index 00000000..91db012b --- /dev/null +++ b/python/cpython.ipynb @@ -0,0 +1,151 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "edcd8abc", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "\"\"\"cpython.\"\"\"" + ] + }, + { + "attachments": { + "image.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABRYAAAJ0CAIAAADoIuhWAAAQAElEQVR4AeydCfxVw///v6UFWVIq2SqSFJJKGyntQkgkhZJU2lEiWoSiJNq0L8pW0SJLWlTa972knYokJCH6P33e/+Z3nLt87ud+7md/3cfbmDNnZs6c55kz817u55b5pD4iIAIiIAIiIAIiIAIiIAIiIAIiIAIREMj8vzT80dBFQAREQAREQAREQAREQAREQAREIPkIyIROPtb/vZKOREAEREAEREAEREAEREAEREAE0hgBmdBp7IGljuFqFCIgAiIgAiIgAiIgAiIgAiKQEQnIhM6ITz1j37PuXgREQAREQAREQAREQAREQASiJCATOkpwaiYCKUFA1xQBERABERABERABERABEUhJAjKhU5K+ri0CGYmA7lUEREAEREAEREAEREAE0jwBmdBp/hHqBkRABJKegK4gAiIgAiIgAiIgAiIgAv8SkAn9LwX9JwIiIALpl4DuTAREQAREQAREQAREIGYEZELHDKU6EgEREAERiDUB9ScCIiACIiACIiACqYuATOjU9Tw0GhEQAREQgfRCQPchAiIgAiIgAiKQDgnIhE6HD1W3JAIiIAIiIAKJI6DWIiACIiACIiACwQnIhA7ORaUiIAIiIAIiIAJpk4BGLQIiIAIiIAJJSEAmdBLCVdciIAIiIAIiIAIikBACqisCIiACIpDaCciETu1PSOMTAREQAREQAREQgbRAQGMUAREQgQxBQCZ0hnjMukkREAEREAEREAEREIHQBHRGBERABCIlIBM6UlKqJwIiIAIiIAIiIAIiIAKpj4BGJAIikKwEZEInK25dTAREQAREQAREQAREQARE4BQB/V8E0h4BmdBp75lpxCIgAiIgAiIgAiIgAiIgAilNQNfPoAQiNaH379+/3vM5cOBAeGC///67p/q/2X379oVvorMiIAIiIAIiIAIiIAIiIAIiIAJJT0BXiJ5ApCb066+/XtHzGTRoUJhr/vPPP02aNPFUr1ijRo3Dhw+HaaJTIiACIiACIiACIiACIiACIiACIhAfgRQ+H6kJnaBhPvPMMzNnznRNTjvttHHjxl177bWuRBkREAEREAEREAEREAEREAEREAERSHMEEmdCB7vd4cOHDx482Hvmtddeq169urdEeREQAREQAREQAREQAREQAREQARFIcwRibELPmjWrU6dOXgodO3Zs0qSJtyS15DUOERABERABERABERABERABERABEUgIgVia0Bs2bHjooYf+/vtvN4B77rmnW7du7lCZmBFQRyIgAiIgAiIgAiIgAiIgAiIgAslOIGYm9IEDB+69996jR4+6W6hYseKQIUMyZcrkSpQRgX8J6D8REAEREAEREAEREAEREAERSJsEYmNC//777/fdd5/3n6264oorJk6cmD179jBY/vrrr9UJ+fh+03vTpk3e1idOnAh1LU598cUXb775ZpcuXR5//PFevXqNHj161apVoepTfvLkSW/n69atozCobNmyxVvzjz/+CFrNCg8ePPjBBx/069evffv2nTt3Hjhw4IwZM6BnZ4OmP/30k7d/X37NmjXffvvtP//8E7StFe7du9fbig6tPJL0+PHj3rZbt24N3yqKGwzfIYNf6fl458CePXug17dv3+7du48ZM2bx4sU8tfC9ubMQ27FjB8379OnTunXrrl27Dhgw4KuvvvJ+h8JV/k/m1AFPbe3atUxy2nbq1GnUqFGLFi3yDu9URf//GbYXafj8xo0bve15dt763333nfesN//rr796a+7atct7dtu2bd6zPGXvWZfnjfZW+/HHH90pMr4XMAx8po23n1CXo0+EfsC4efNmbxNvnt6oJhEBERABERABERABERCBFCEQAxMaa+SRRx5Bx3U3kCdPnilTppx33nmuJGgGW+LmhHxmzZrl7adx48be1qjd3rOW/+2335599tkiRYrcfffdZAYNGjR+/PhXXnmlXbt2lStXrlChwsiRIxm/VfammPfezu+66y7vWW/+0Ucf9dbcv3+/96zLr1+/vmnTpsWKFYNVjx49sLiGDBnyzDPPNGzY8MorryTzww8/uMrezOzZs739+/KVKlW66qqr8ubNW758+bfffjuoBYjF7m01Z84cb//h8xhR3rYtW7YMVT/qGwzVoZW/9tprVTwfaFB+6NAhXCHXXHMN9Hr27Emdtm3b1qxZkwc6efJkKoSRY8eOdejQIX/+/Ndddx3NX3zxxXHjxr3xxhvPPfdc7dq1L7vsMozqP//8M0wPMKlTpw493HTTTS1atKDt0KFD8YnUqlWrYMGC119//aRJk7ADQ/XA0/ciDZ9nhN5+uH1v/eHDh3vPevMA8daE0r9nT/3XqlUr79ndu3efOvOf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vXv30KFDw3tkrrvuOipv3boVaO+99968efO+/fZb7GesaLvuzp077U5Jvf/Akp21lJgnE2nDhg379+/HB8RzJDTtJtVbb70FNKtpKWYhlZn2+/fvX716NSMP47LBFOTSTtb+9yfcfZOBu8YJYlfxpWXKlHGdkGHAvgqRHL700ku0ddK4cWNvK98LeNddd3nPekSX/GUAABAASURBVPMffvih64SM44MThKdGiRPWGW9Dy+fOndtVIMNbY+UuvemmmwD7wQcfTJs2bdGiRXg33CllREAEREAEREAEREAERCC2BCI1oWN1VeJUGDkETsNYEbG6lrcfDOwKFSpggTRt2vTWW28tUaJEdOFWb5/R5bGx0fgbxH2wczCZousn1bZKzhvMly9flSpVCCwTjyU6HTkTZmDt2rWvv/76eL+VHabPM888E5ucJ0lo2iZV0FmNwY9Rx7RPqSkX5hYSdCo1Vz7vvPNq1qxJBPv0009PzePU2ERABERABERABERABNI6geQ2odM6L41fBEQgLRLQmEVABERABERABERABEQgJgRkQscEozoRAREQgaQioH5FQAREQAREQAREQARSDwGZ0KnnWWgkIiACIpDeCOh+REAEREAEREAERCCdEZAJnc4eqG5HBERABEQgNgTUiwiIgAiIgAiIgAgEEpAJHchEJSIgAiIgAiKQtglo9CIgAiIgAiIgAklEQCZ0EoFVt7Eh8Oqrr/7g+dSrVy82/aoXERABERCB1EpA4xIBERABERCB1ExAJnRqfjoa2/+yZMmS3fMJ+q9GCZMIiIAIiIAIpBICGoYIiIAIiEC6JyATOt0/Yt2gCIiACIiACIiACMRPQDVEQAREQAQiISATOhJKqiMCIiACIiACIiACIpB6CWhkIiACIpBsBGRCJxtqXUgEREAEREAEREAEREAE/AR0LAIikLYIyIROW89LoxUBERABERABERABERCB1EJA4xCBDEhAJnQGfOi6ZREQAREQAREQAREQARHI6AR0/yIQHQGZ0NFxUysREAEREAEREAEREAEREAERSBkCumoKEpAJnYLwdWkREAEREAEREAEREAEREAERyFgE0vrdyoRO609Q4xcBERABERABERABERABERABEUgOAlxDJjQQJCIgAiIgAiIgAiIgAiIgAiIgAiIQP4G0a0LHf2+qIQIiIAIiIAIiIAIiIAIiIAIiIAIxJCATOoYwI+9KNUVABERABERABERABERABERABNIeAZnQae+ZpfSIdX0REAEREAEREAEREAEREAERyKAEZEJn0AefUW9b9y0CIiACIiACIiACIiACIiAC0ROQCR09O7UUgeQloKuJgAiIgAiIgAiIgAiIgAikMAGZ0Cn8AHR5EcgYBHSXIiACIiACIiACIiACIpAeCMiETg9PUfcgAiKQlATUtwiIgAiIgAiIgAiIgAj8fwIyof8/CP1PBERABNIjAd2TCIiACIiACIiACIhALAnIhI4lTfUlAiIgAiIQOwLqSQREQAREQAREQARSHQGZ0KnukWhAIiACIiACaZ+A7kAEREAEREAERCB9EpAJnT6fq+5KBERABERABKIloHYiIAIiIAIiIAIhCciEDolGJ0RABERABERABNIaAY1XBERABERABJKWgEzopOWr3kVABERABERABEQgMgKqJQIiIAIikAYIyIROAw9JQxQBERABERABERCB1E1AoxMBERCBjEJAJnRGedK6TxEQAREQAREQAREQgWAEVCYCIiACCSAQjQl97NixvXv3rl+/fsmSJQv1EQEREAEREAEREAEREAERSBkCuqoIiMBCzFKMU0xUDNUEmMLRVk2YCc2YtmzZsmrVqt27d//8888nTpyI9rpqJwIiIAIiIAIiIAIiIAIikJEJ6N5FIDYEMEsxTjFRMVQxVzFaY9NviF4SYEIfOHCAMR06dIiuzjrrrHz58l166aWX6SMCGZUALwKSUe9e9y0CIiACqYIA6zCSKoaiQYiACGQsArrbVEQAsxTjFBOVHQFzFaMV05V8EkmkJjRh8e3btzMIRsYQ8+bNmyNHjixZslAiEQEREAEREAEREAEREAEREAERSCME0tswMUsxTjFRMVQxV7k9TFcMWDJJIRGZ0BjxhMW5/Pnnn8/IGCJ5iQiIgAiIgAiIgAiIgAiIgAiIgAgkI4Fwl8JQxVzFaKUSBixmLJmYS/wm9LFjxzDiuTBDOeecc8hIREAEREAEREAEREAEREAEREAERCAVEsBoxXRlYJixGLNkYivxm9B79uzhkgTEGQqZ/xPlREAEREAEREAEREAEREAEREAERCCVEcB0xYBlUGbMkomhxGNCY7Ufivv9sFy5csXwqinflUYgAiIgAiIgAiIgAiIgAiIgAiKQTgmYAYsxi0kb21uMx4T+8ccfuR4WfBb9chggUoloGCIgAiIgAiIgAiIgAiIgAiIgAqEJYMBixnLeTFoysZJ4TOgjR45wpRw5cpBKRCAGBNSFCIiACIiACIiACIiACIiACCQ9ATNjzaSN4dXiMaF/++03LpY9e3ZSiQhkdAK6fxEQAREQAREQAREQAREQgTRCwMxYM2ljOOR4TOgTJ05wMYLgpBIREIE0TEBDFwEREAEREAEREAEREIGMRMDMWDNpY3jf8ZjQMbySuhIBERCBKAmomQiIgAiIgAiIgAiIgAikDgIyoVPHc9AoREAE0isB3ZcIiIAIiIAIiIAIiEA6IiATOh09TN2KCIiACMSWgHoTAREQAREQAREQARH4LwGZ0P/loSMREAEREIH0QUB3IQIiIAIiIAIiIAJJQEAmdBJAVZciIAIiIAIikBgCaisCIiACIiACIpBaCciETq1PRuMSAREQAREQgbRIQGMWAREQAREQgXRNQCZ0un68ujkREAEREAEREIHICaimCIiACIiACMRHQCZ0fIR0XgREQAREQAREQARSPwGNUAREQAREIFkIyIROFsy6iAiIgAiIgAiIgAiIQCgCKhcBERCBtENAJnTaeVYaqQiIgAiIgAiIgAiIQGojoPGIgAhkMAIyoTPYA9ftioAIiIAIiIAIiIAIiIARUCoCIpBwAjKhE85MLURABERABERABERABERABFKWgK4uAilEQCZ0CoHXZUUgFRN47733msR92rVrl4qHqaGJgAiIQPIR+PPPP/fs2bN169bDhw+fPHky+S4c7ZV69uwZt5A3GTJkSLR9qJ0IiECSEVDHaZlAypvQx48ff/TRR5s2bVq0aNF7771306ZNaZmnxi4CiSLwzjvv2LvA60DGyWOPPdatW7d33333l19+SdQFImu8e/fuxXGfFStWRNZCtURABEQgfRL4+eefR4wYUbNmzRIlStSoUaNu3boVKlSoWLFijx49du7cGfSeWa4ffPBBlnHELeNk2rRp06tXr88///zEiRNBG8a2cN26dXEL+eJt27bFtmf1JgIikNEJZPj7T3kTes6cOQsWLFi0aBHPguV+8uTJZCQikDEJ7Nixw94Fbp+Mky+//JLIcPfu3StVqkSes4kUbONnT32OHDmSyN7UXAREQATSJYGFCxdWrVq1b9++OBa9kWcC0Xg869evP3/+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9u07Z86cAQMGuJ/Fpo4T91Vt5wN1IehKlSrZT0K6yjHPuJWc+IH7Krv3KlrJvTSUFwERyMgEUsCEZmPAwnTQUal94k5hWW8+9XtFefPmdeXffPONy8c2ky9fPuuwWLFi9QI+9913391xH/zHVs2bFi9eHKey++GlPn36sKt6KygvAgkigNnc9tSnZcuWTD1C0GF6cN/ltj+cc4pXrVq1fH+cHKaT6E55X0/3B9Lertw7663praC8CIiACBiB1JB6471jx479+++/g44KY7hhw4YPxH2WLl0aWKdMmTKnVvF//9+sWbPbbrvtggsuCKxpJbjyb731Vsv7VvKov0xkvUWS5smTx6pxv7t27bK8SwmGm1uWEq3kQJCIgAhkZAIpYEIvXLjQfVlo6NCh7Do+Wbx4MbuIPRUXrz7//POddcqmdfz4catg6d69eytXrkyorXz58mvWrLHCKFKaWysieIEu2KNHj34f9wn6RW4ann766W+88YaFsvEUxPvPX9FEIgKxInDTTTfhjaK3AwcObNmyxZnQaGwUhhH3z6uEqRP+1NVXX+3CI5999pnvz942btzIG2o98JJaRqkIiIAIpFoCV155pfsFB7zh7OyBQ/3rr78GDx5s5ZkyZbLfdLTDxKTuu9zz588/ePDghg0b6A29IvxPQiZ+GecqFStWJDWZOXOmZVzqLfHWdBWUEQEREIGMQyAFTGhnFbMlBNWnzzvvvNKlS9szYMl26rhzwe7evbtnz54nT560OrhLu3Xrhtlw+PDhs846q0SJElYeRXrnnXfanwx99913Xbp0cZegqz179tSuXbtS3Oedd96hJKgUKlSoV69edgqXLVY0trQdKhWBJCWQNWtWpqhdok2bNhb4zZ8///XXX2+F3jRnzpzuMPAfkHOnIsx4L718+XKnVtIcx1OHDh14Sckj8drz1JGIgAiIQIoTcP++BiMZNmzYu+++693NUQnuu+8+/IOcRbB7WWzJJF6KFy9uv3ZBsIFLmB4S6ich3Uq+bNkyVKBEXv2aa64pWLCgdcIt289q2OGmTZv69etn+dy5cwdV3uysUhEQARHICASS24Q+duzY7NmzjezNN9+cLVs2y/tS9x0qDGP3zz88/PDDbnGfMmUKxmzXrl3RzgkdL1q0yHq45557cAZbPoqU/cP9g40ff/wx6j728OjRo59++unbb78dk5g+8+TJc//995MJJZgxjRs3trN4r/v06WN5pSKQ1ASYpXYJF/XF8RT0jTAVzSqPGjWK+EarVq1QkqwkihRvEXqVNRw4cCAKX48ePVq0aHHjjTeia1p5w4YNw38X3aopFQEREIEUJ0BUmSXLhoEd2717d5Y11knWuppxH7dgFilS5Mknn7SaMUndSo4KZB2yklvGl7qV/Pjx4yhFDz30UCJVDtZt2zKIXjRp0qRevXovvfRSgwYNUK7cV/NwLmTJksU3khQ/1ABEQAREIDkJJLcJ/cUXX7DQ2x1Wr17dMoEpG5Ut4pxyUWv7mrT7aV8M2kmTJhFA++WXX6iGsHk0a9aMTGLkgQceaN26tfVAHO/tt99mQ/roo4/++OMPCs8555yRI0fa12U5DCWdO3d2wfDx48d7fxctVBOVi0DiCRBwdi+I9YYbyDK+FMULJdAV7t+/f86cOQQ9XElCM7ly5XrzzTedFb1v37533nln3rx57n2vWrVqp06dEtqt6ouACIhAShHAVmzevLm7OgYt6+Snn366e/dujGorx2n+3nvv4Vu3w5ikvnX7vPPOCxX1Redx1ixB8qVLl65ZsyYxYyhbtuzzzz9vfXKPhNnHjRtHn1jUdIti1q5du1q1apGXxJCAuhIBEUhzBJLbhHbGZPbs2YlCh+KVL18+AsJ2lu3K+T7x9U6ePBlT2X15iTp0RWUM3S5durg/oqY8asGE7tatGzaGt4ccOXLgkf3ss88Yg7c8aJ7t5/XXX2fbs7NEy8P8pKfVUSoCiSeAfuPCF/RWuHBh7+/KUuIVYgvt27cvWLAgbxDlmTNnZt6SiVow4Hk9iVecddZZ3k54ZYhsEJrGC+YtV14EREAEUjMBVtSOHTsOHz4cC5a8b6h58+Z9+umn+/fvH/S3tX2VE3R4ySWXlCxZ0jXBSg+1OBcrVgwTF20KJ6aNMNSX+1xv8Wbuv//+CRMm4PT0XpTOK1asOGrUqJYtW8bbgypkKAK6WRHImASS24QeNmzYlrjP2rVrA/9FRO8zeP/99+Mqblm+fLl3S8B4xlReuHAh1uzYsWOnTp26cuXKDz74oG7dut7m5NnbrIcFCxZw6JMNGzbYWa+P2dVhC5k5c+bcuXOJpBFGnj9/PlchtuysYldzypQp1o/7MyE7lT9//sWLF9spPLhYEVZuaaFChewUaZUqVaxQqQg8++yzTAkTVJYogHhflnvuuSdMD3iFWrRogYuKl5HpvW7dOvevshEutjF89dVXgT188skndvaFF17wnb3gggu6d+++aNEi6owePZrgzJdffjlt2rT77rsv8HaWLVtm/XQI+FfisMbtFKn7QofvWjoUAREQgWQgcNNNN2E6fvHFFygwuNdZHnHZo6KwuD388MNBB4BmwtqFoD8ErRBvoXk2rVq9evUsEzRltXzrrbdYdVnDV61ahV7kqk2aNIkxINj5rtAyhM0pN/E6Xu0sq+6gQYOWLFny0Ucfce/oOeRHjhxZvnx5q+DSK6+80johxcZ25ZZhi6EcYWxWolQEUhUBDUYEoiaQjRC2gAAAEABJREFU3CZ01AP1NcQ5WqBAgbJly7J8k/edjdUhZjCe4DJlyuBsjlWf6kcEko7AoUOHMFyt/9y5cxMQtny8KeZ0DN8jzHicRChb6GH5Tv1DcfGOQRVEQAREINUSuOiiiypVqoR7vWnTprjsr7322kC3YKwGT5AAk9V6q1y5cvHixS0fPs2aNWv4yET45oFnzzrrrKJFixKBJ9Yd79+vBTZXiQiIQJISUOcpSyCtmtApS01XF4FUReDo0aMTJ0588cUXUe/cv9vZrFkzfXE6VT0mDUYEREAEwhDYvn37hAkTOnfu3LFjR1etTZs2Lq+MCIiACKQPAungLmRCp4OHqFvI6ASOHDnSs2fP8ePHux/irlatGuZ0Ruei+xcBERCBtENg3bp1L7zwwtSpU+1HUjNnzty+ffsIQ9Bp5y41UhEQARFI2wRs9DKhjYNSEUgnBC644AKCGPrtrnTyOHUbIiACGY9AlixZChcuPGLEiBYtWmS8u9cdi4AIiEAaIJBGTeg0QFZDFIFkI5A3b96333570qRJK1eunDdvXpMmTZLt0rqQCIiACIhATAhUrlx53Lhx06dPX7169YwZMypUqBCTbtWJCIiACIhAzAnIhI450ng7VAURiDGBbNmylS5d+uqrr86RI0eMu1Z3IiACIiACyUIgV65cN9xwwxVXXJE1a9ZkuaAuIgIiIAIiECUBmdBRgsuozXTfIiACIiACIiACIiACIiACIpBxCciEzrjPPuPdue5YBERABERABERABERABERABBJFQCZ0ovCpsQgkFwFdRwREQAREQAREQAREQAREIOUJyIRO+WegEYhAeieg+xMBERABERABERABERCBdEJAJnQ6eZC6DREQgaQhoF5FQAREQAREQAREQARE4P8IyIT+PxbKiYAIiED6IqC7EQEREAEREAEREAERiDEBmdAxBqruREAEREAEYkFAfYiACIiACIiACIhAaiQgEzo1PhWNSQREQAREIC0T0NhFQAREQAREQATSLQGZ0On20erGREAEREAERCDhBNRCBERABERABEQgHAGZ0OHo6JwIiIAIiIAIiEDaIaCRioAIiIAIiECSE5AJneSIdQEREAEREAEREAERiI+AzouACIiACKQNAjKh08Zz0ihFQAREQAREQAREILUS0LhEQAREIAMRkAmdgR62blUEREAEREAEREAEROC/BHQkAiIgAgkjIBM6YbxUWwREQAREQAREQAREQARSBwGNQgREIAUIRGRC79BHBEQggIC9rwHFKhABERABEUg+AlqKk4+1riQCMSag7kQgOQjYNhHbNCITOraXVG8iIAIiIAIiIAIiIAIiIAIikGYJaOAZmkA8JnTeuM+N+oiACAQQiHs58gYUq0AEREAERCD5CGgpTj7WupIIiEA6IZCxbsO2idha/PGY0LG9mHoTAREQAREQAREQAREQAREQAREQgagIpIpGMqFTxWPQIERABERABERABERABERABERABFI/gWhN6NR/ZxqhCIiACIiACIiACIiACIiACIiACMSUQIY0oWNKUJ2JgAiIgAiIgAiIgAiIgAiIgAhkEAIyodPag9Z4RUAEREAEREAEREAEREAEREAEUoiATOgUAp8xL6u7FgEREAEREAEREAEREAEREIG0TEAmdFp+ehp7chLQtURABERABERABERABERABDI8AZnQGX4KCEBGIKB7FAEREAEREAEREAEREAERiAUBmdCxoKg+REAEko6AehYBERABERABERABERCBVENAJnSqeRQaiAiIQPojoDsSAREQAREQAREQARFIXwRkQqev56m7EQEREIFYEVA/IiACIiACIiACIiACAQRkQgcgUYEIiIAIiEBaJ6Dxi4AIiIAIiIAIiEDSEJAJnTRc1asIiIAIiIAIREdArURABERABERABFIxAZnQqfjhaGgiIAIiIAIikLYIaLQiIAIiIAIikN4JyIRO709Y9ycCIiACIiACIhAJAdURAREQAREQgQgIyISOAJKqiIAIiIAIiIAIiEBqJqCxiYAIiIAIJBcBmdDJRVrXEQEREAEREAEREAERCCSgEhEQARFIUwRkQqepx6XBioAIiIAIiIAIiIAIpB4CGokIiEDGIyATOuM9c92xCIiACIiACIiACIiACIiACIhAVARkQkeFTY1EQAREQAREQAREQAREQARSioCuKwIpR0AmdMqx15VFQAREQAREQAREQAREQAQyGgHdbxonkFpM6N9///3rr7/evHnz0aNH0zhSDV8EREAEREAERCAdEvjxxx+3bt36888/p8N70y2JgAikZQKLFy/u0KHDk08+mRw3oWv8738pbELv3r27W7duRYsWzZcvX6lSpcqWLXvhhRcWKFCgbdu269at0wMSgQxL4OTJkxs3bhwxYkSzZs3qBvvs27cvw8LRjYuACIhAshH4559/Pv74Y5ZhFJVChQqVKVPmkksuueiiixo2bDhv3rwEDeOpp56in4kTJyaolSqLgAikCQJ33333OXEfXnMnDRo06NevH/btH3/8kaR3sWXLlpEjR44aNSpJr5IeOo/RPaSkCT1gwIASJUr079//u+++897OTz/9NGbMmBtvvBFvyl9//eU9pbwIZAQC33//fcWKFcuXL9+xY8f3339/brDPb7/9lhFQ6B5FQAREIAUJHDhwoEqVKvfffz/L8O+//+5G8uuvv86YMeOOO+648847f/nlF1cePrNixQr62bFjR/hqOisCIpAWCfB227DJOJk5c2aPHj1q1qx5+eWXL1261CpEna5du/aZuA9LUNSdqGFMCKSMCc3QH3/88eeeew7nLnmTs84667zzzrO8pXhT2JyS2m1j11IqAqmEwLffflu7du0NGzYwnuLFizdq1KhLly5dT33uvfdeyiUiIAIiIAJJTQBbF/t59erVXOjaa68dNGjQ/PnzN2/ePGfOnL59+6IQU06+WrVqhw4dIi8RAREQgXPPPfeFU5+ePXti71StWjVz5sz42u66664lS5YkBtHWrVsHxn1kQicGY0zapowJPXHixPHjx9sNMKvatGmzadMmYtG7d+/euXNn9+7dc+TIYWcXLFjw0ksvWT6VpBqGCCQpAWzmr7/+OkuWLKNGjVq8ePHgwYMxoTud+tSrVy9Jr67ORUAEREAEIICLv0WLFvg0yePDXLhwYePGja+77rqLLrqodOnSzZs3X7lyZbNmzTi7ZcuWp556ioxEBERABNp5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bnPlyrVmzZpdu3Zt3769a9euyfkn64kYdURN8dYdPny4SpUqEdVOg5UyShQ6DT6aVDhkDUkEREAEREAEREAEREAERCAGBLCZCaFjSMegr1TWRebMmbNkyZLKBhXL4ciEjiVN9ZWKCWhoIiACIiACIiACIiACIiACIpBYAjKhE0tQ7UUg6QnoCiIgAiIgAiIgAiIgAiIgAqmCgEzoVPEYNAgRSL8EdGciIAIiIAIiIAIiIAIikH4IyIROP89SdyICIhBrAupPBERABERABERABERABP5DQCb0f3DoQAREQATSCwHdhwiIgAiIgAiIgAiIQOwJyISOPVP1KAIiIAIikDgCai0CIiACIiACIiACqZSATOhU+mA0LBEQAREQgbRJQKMWAREQAREQARFIzwRkQqfnp6t7EwEREAEREIGEEFBdERABERABERCBeAjIhI4HkE6LgAiIgAiIgAikBQIaowiIgAiIgAgkBwGZ0MlBWdcQAREQAREQAREQgdAEdEYEREAERCDNEJAJnWYelQYqAiIgAiIgAiIgAqmPgEYkAiIgAhmLgEzojPW8dbciIAIiIAIiIAIiIAKnCOj/IiACIpBgAjKhE4xMDURABERABERABERABEQgpQno+iIgAilDQCZ0ynDXVUVABERABERABERABEQgoxLQfYtAGiYgEzoNPzwNXQREQAREQAREQAREQAREIHkJ6GoZnYBM6Iw+A3T/IiACIiACIiACIiACIiACGYOA7jIGBGRCxwCiuhABERABERABERABERABERABEUhKAqmlb5nQqeVJaBwiIAIiIAIiIAIiIAIiIAIiIAKpnEBUJnQqvycNTwREQAREQAREQAREQAREQAREQASSgEDGM6GTAKK6FAEREAEREAEREAEREAEREAERyAgEZEKnqaeswYqACIiACIiACIiACKRfAidPnvzuu++2bdv2yy+/pN+71J2JQNomIBM6bT+/tDR6jVUEREAEREAEREAERCAYgRMnTkyaNKlatWp58+YtWrRo6dKlL7744uLFiz/33HM//vhjsBYqEwERSDECMqFTDL0unJYIaKwiIAIiIAIiIAIikDQECDtXqlSpadOmy5Yt++OPP9xF9u7dO2DAAE6tXbvWFSojAiKQ4gRkQqf4I9AARCCJCah7ERABERABERCB1Epg9+7dVatW3bBhAwMsU6bMqFGjlixZsnr16tGjRzdv3jxr1qwY0jVq1CBGTQWJCIhAaiAgEzo1PAWNQQREIAQBFYuACIiACIhAuibQtm3bb7/9llvs3r377Nmz77nnnmLFil1++eX16tXr27fvJ598cvHFF//++++Y01u2bKGaRAREIMUJyIRO8UegAYiACKRTArotERABERABEQhLYMqUKXPnzqVKy5YtO3bsSMYnN9xww7vvvpspU6YTJ0706tXLd1aHIiACKUJAJnSKYNdFRSA4gT59+tz+38+dd97ZunXrUaNG/fnnn742Vhmnta/cd7hixQrr8ueff/ad4vDLL7988MEHS5QokS9fvgoVKjz++OPjx4//559/OBUohw4dwiN+8803FypU6IILLihdujRjC/oHWnjNuSgedF8n+NGbNWvGKVLy3rM415988kl0hfz58xcoUODGG2988cUX9+/f761jebtxOgmUTp06WR2XoprYDebNm7dIkSI1a9YEpu/SrrIvc+zYsbp163KV999/33fKDidPnszZu+666/jx41by8MMPU/LBBx9wuGHDBi597bXXwpb76tq164EDBygPKn/88cfEiRNvu+22okWLMtRrrrmmQYMGYDx58qSv/r59+7iETx544IHnn39+48aNoSpv3brVd4pD7vjVyXUAABAASURBVIt+GDN5n+zbt4+76NKlC3dHHSdjxozx1dShCKQ/Au4tS+iLwztLqPCmm25iHStXrtxjjz3GKxP4FlPNvVOhMhMmTHBgw4+HRds6OXz4sGviMgla5BlY5OMPXOHtos899xzjYbOwQ0sbN25MYdCvIm/evJlTyHfffWeVXfrTTz/16NGDVejKK69k32FBZqHbtm2bq+DNYGHOnz//jTfeaNq0Kb15hQXWWzNo3naWUFsqezEdfv755762XHTo0KGNGjW6/vrrL7zwwmrVqj3xxBNz5szxVQtzaA86V65czz77bKhq7CNcnbOzZs0KVAYol4iACCQzAZnQyQxclxOBcATQJFB3vMJOPG7cuPbt26ON+X6T0yqvW7cuXI//+x9KlXUYuO/279+fXfmjjz7auXMnViUmH6oYVnT9+vV/Cfi3NLBmMZ579uy5evVqRoJ5iR7D2CicMWOGbwzffvstF12wYIG3HFUDkxKzbf369fjazzjjDHd2/vz52MzDhg3DkP7tt99Qm7gvFBoK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dbyFGGlXX301JhmWNtqM91Ti84zh+uuvv/baa2MYArUbJK6OGhqJIhXqLlCVcB+gaLZo0SJUHV85fAh3w5bAte9U0EOCDIULF2aoWNQY4UHrqFAERCA1E2A5JXZ69tlnp55B2hrIQsQCG++oUtv4WbTxPrAk+szjeG8k2SowsGLFihUtWtR8rIm8bq5cufBWP/DAA02aNClVqhSbQiI7VHMREIGkICATOimoqs/YE1CPIpCyBAgmP//884yhQYMGWMVkJCIgAiIgAiIgAiIgAhmQgEzoDPjQdcvJTUDXS9MEnnzySSIMFSpU2L9/P8Hkzp07p+nb0eBFQAREQAREQAREQAQSQ0AmdGLoqa0IpH8CusN9cZ8zzjjj5ptvnjdvXoECBcIwyZUrV+7cuc8888wwdXRKBERABERABERABEQg7RKQCZ12n51GLgIiEA+BmJx+8803169fTwh6+vTpF110Ufg+lyxZsnPnzscffzx8NZ0VAREQAREQAREQARFIowRkQqfRB6dhi4AIJBOBPHnyEHnOnDm5V8tkuj1dRgREQAREQAREQAREICEEpBQmhJbqioAIiIAIREBAVURABERABERABEQgvRKQCZ1en6zuSwREQAREIBoCaiMCIiACIiACIiACYQjIhA4DR6dEQAREQAREIC0R0FhFQAREQAREQASSmoBM6KQmrP5FQAREQAREQATiJ6AaIiACIiACIpAmCMiEThOPSYMUAREQAREQARFIvQQ0MhEQAREQgYxDQCZ0xnnWulMREAEREAEREAER8BPQsQiIgAiIQIIIyIROEC5VFgEREAEREAEREAERSC0ENA4REAERSH4CMqGTn7muKAIiIAIiIAIiIAIikNEJ6P5FQATSKAGZ0Gn0wWnYIiACIiACIiACIiACIpAyBHRVEcjIBGRCZ+Snr3sXAREQAREQAREQAREQgYxFQHcrAokkIBM6kQDVXAREQAREQAREQAREQAREQASSg4CukRoIyIRODU9BYxABERABERABERABERABERCB9Ewg3dybTOh08yh1IyIgAiIgAiIgAiIgAiIgAiIgArEn4O1RJrSXhvIiIAIiIAIiIAIiIAIiIAIiIAIiEJJARCb0tlT00VBEILUQsLcqtYxG4xABERCBDElAS3GGfOy6aREQARGIlIBtE7FNIzKhY3vJDNybbl0EREAEREAEREAEREAEREAERCANE4jIhC6ijwgUEQI/AXvv/aU6FgEREAERSEYCWoqTEbYuJQIiIAJpj4BtE7FNIzKhY3tJ9SYCyU5AFxQBERABERABERABERABERCBGBCQCR0DiOpCBJKSgPoWAREQAREQAREQAREQARFILQRkQqeWJ6FxiEB6JKB7EgEREAEREAEREAEREIF0RUAmdLp6nLoZERCB2BFQTyIgAiIgAiIgAiIgAiLgJyAT2k9ExyIgAiKQ9gnoDkRABERABERABERABJKEgEzoJMGqTkVABERABKIloHYiIAIiIAIiIAIikHoJyIROvc9GIxMBERABEUhrBDReERABERABERCBdE5AJnQ6f8C6PREQAREQARGIjIBqiYAIiIAIiIAIxE9AJnT8jFRDBERABERABEQgdRPQ6ERABERABEQgmQjIhE4m0LqMCIiACIiACIiACAQjoDIREAEREIG0REAmdFp6WhqrCIiACIiACIiACKQmAhqLCIiACGQ4AjKhM9wj1w2LgAiIgAiIgAiIgAj8739iIAIiIALREJAJHQ01tREBERABERABERABERCBlCOgK4uACKQYAZnQKYZeFxYBERABERABERABERCBjEdAdywCaZuATOi0/fw0ehEQAREQAREQAREQAREQgeQioOuIwP9kQmsSiIAIiIAIiIAIiIAIiIAIiEC6J6AbjA0BmdCx4aheREAEREAEREAEREAEREAEREAEkoZAKupVJnQqehgaigiIgAiIgAiIgAiIgAiIgAiIQGomkHATOjXfjcYmAiIgAiIgAiIg6lx2+wAAEABJREFUAiIgAiIgAiIgAklGIIOZ0EnGUR2LgAiIgAiIgAiIgAiIgAiIgAikewIyodPOI9ZIRUAEREAEREAEREAEREAERMBDYN++fXPmzFm7dq2n7H8//fQThYsWLfIWKh8rAjKhY0VS/YQloJMiIAIikOEJHD9+fNu2bStXrpw2bdprr71Wp06dSZMmZXgqAiACIiACGYvAd999t2HDhnnz5o0fP75t27a1atVK5P1v3779zrjPiRMnXFcjR46krG/fvq5EmRgSSAETesaMGXVPfb7//vtQN/PFF1+cqlV3xYoVoaqpXASSnEAyXmDBggU27Q8dOhT0snPnzrUKL7zwQtAKKhQBEUhtBIgMPPfcc9WqVbv44otLly5d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LduUKVPY1DjJXtWHzFVXXTVz5kyU8JIlS1CtGzZsQM22b9+eWz7CCaeHyFS2bFlfq5CXPJF+3n777ZB3E60kc86MELv99tspwxHaHheaGZGI3rJly5AhQ0yycOHCPB268sorrcZbdu/enVu08lYaT/75448/3rZt26JFixYsWMAx98knnxBOtbvekrApnZCd9lYanz9/fm5BZLatRqUQEAJCINUQkAudalDrQZkBgdSfw9lnn01688ILLyQhnOjTTznllKJFi1asWDEany1PnjxYh+eee264bk8//fQoM8nhekhSPZmNggULMnieG7khNl/x4sVJ0WfPnj2ypO4KASEgBFITASJ6JUuWRLW6nG1qPj2pzxoxYgTp7jPPPNP7je4IneByE8dEA0eQif4WEd7SpUsTLOCYi76VJIWAEBAC6QEBudDp4S1oDEIgNRDQM4SAEBACQkAIgMA///yzePFiy+526NAhZ86cVIqEgBAQAkIgSgTkQkcJlMSEgBBISwRS6Nm5c+cmWZSayfYUmoi6FQJCIP0jQI4ahUPWN9GhkphFMoU829tvv71IkSI33XTTb7/9dumll7Zr1y7R8Ui/ICXbAAAQAElEQVRACAgBISAEvAjIhfaiIV4IpDECp59++llnnYWZlcbjyDKPHzZs2IYNG0L+kjmOGKgrISAEhAAIPPDAAyicZ599Fj4yzZgxA8mmTZtGFovt7tatW/fu3XvaaafVrVv3ww8/5NyJrR+1EgJCQAhkWQTkQmfZV6+Jp0cEhg8fvm3btsmTJ6fHwWlMWRIBTVoICIFMhsCbb765bt267777jrNGEdtM9nI1HSEgBFIHAbnQqYOzniIEhIAQEAKpjYCeJwSEQBCB888/P3/+/MF61QgBISAEhECUCMiFjhIoiQkBISAEhIAQSD0E9CQhIASEgBAQAkIgfSIgFzp9vheNSggIASEgBIRARkVA4xYCQkAICAEhkIkRkAudiV+upiYEhIAQEAJCQAgkDQFJCwEhIASEgBCIjIBc6Mj46K4QEAJCQAgIASEgBDIGAhqlEBACQkAIpAICcqFTAWQ9QggIASEgBISAEBACQiASAronBISAEMgoCMiFzihvSuMUAkJACAgBISAEhIAQSI8IaExCQAhkKQTkQmep163JCgEhIASEgBAQAkJACAiB/0dAnBAQAklFQC50UhGTvBAQAkJACAgBISAEhIAQEAJpj4BGIATSBAG50GkCux4qBISAEBACQkAICAEhIASEQNZFQDPPuAjIhc64704jFwJCQAgIASEgBISAEBACQkAIpDYCWfx5cqGz+ALQ9IWAEBACQkAICAEhIASEgBAQAlkFgeTPUy508jFUD0JACAgBISAEhIAQEAJCQAgIASGQJRBIQxc6S+CrSQoBISAEhIAQEAJCQAgIASEgBIRApkFALnRsr1KthIAQEAJCQAgIASEgBISAEBACQiDLIRCVC71Rn0yFgCYTHwRMW8SnL/UiBISAEBACMSEgVRwTbGokBISAEMgqCNgxEd8yKhc6vo9Ub0IgGQioqRAQAkJACAgBISAEhIAQEAJCIM0QiMqFLqqPEBACAQRs1waqI1TolhAQAkJACMQZAaniOAOq7oSAEBACmQsBOybiW0blQsf3kepNCAiBDIiAhiwEhIAQEAJCQAgIASEgBITAcXKhtQiEgBDI9AhogkJACAgBISAEhIAQEAJCID4IyIWOD47qRQgIASGQMgioVyEgBISAEBACQkAICIF0hIBc6HT0MjQUISAEhEDmQkCzEQJCQAgIASEgBIRAZkNALnRme6OajxAQAkJACMQDAfUhBISAEBACQkAICIEQCMiFDgGKqoSAEBACQkAIZGQENHYhIASEgBAQAkIgpRCQC51SyKpfISAEhIAQEAJCIOkIqIUQEAJCQAgIgXSNgFzodP16NDghIASEgBAQAkIg4yCgkQoBISAEhEDmR0AudOZ/x5qhEBACQkAICAEhIAQSQ0D3hYAQEAJCICoE5EJHBZOEhIAQEAJCQAgIASEgBNIrAhqXEBACQiD1EJALnXpY60lCQAgIASEgBISAEBACQuB/EdCVEBACGQwBudAZ7IVpuEJACAgBISAEhIAQEAJCIH0goFEIgayIgFzorPjWNWchIASEgBAQAkJACAgBIZC1EdDshUCMCMiFjhE4NRMCQkAICAEhIASEgBAQAkJACKQFAnpmWiIgFzot0dezhYAQEAJCQAgIASEgBISAEBACWQmBDD9XudAZ/hVqAkJACAgBISAEhIAQEAJCQAgIASGQ8gj8+wS50P+ioP+EgBAQAkJACAgBISAEhIAQEAJCQAgkikCGdaETnZkEhIAQEAJCQAgIASEgBISAEBACQkAIxBUBudBxhTPKziQmBISAEBACQkAICAEhIASEgBAQAhkQAbnQGfClpe2Q9XQhIASEgBAQAkJACAgBISAEhEBWRUAudFZ981lz3pq1EBACQkAICAEhIASEgBAQAkIgGQjIhU4GeGoqBFITAT1LCAgBISAEhIAQEAJZA4HDhw9v3Ljx22+/PXr0aNaYsWaZkRBISxf6n3/+2bx58yuvvNKtW7d69erVDXyaNWuWkbDUWIVAshFYtGiR7YN9+/ZF6Oy3334zsffffz+CWDq6paEIASEgBDIUAvfee+8ZCR9TtlY2atRo0KBB8+fPx7jPULPRYIVAhkFg27ZtPXr0KFSoUL58+cqXL3/ZZZflzZu3YcOGs2bNyjBz0ECzAAJp5kLv2rWrYsWKV1xxRdu2bV988cWPPvqIM8lHCxcuzAKvQFMUAv+PwJ49e2wX/P777/9fG+D+/PNPEyM6G7ipingjoP6EgBDIeggsXbrUJm3K1soPPvjgiSeewJ0uWLDgW2+9ZQIqhYAQiBcCY8aMKVu27NixY3/44QfXJzbP3Llzb7/99oceeuivv/5y9WKEQBoikDYu9Ndff3399ddv2LAhDWeuRwsBISAEMj8CmqEQEALJQ2CA59OlS5datWplz579yJEjLVu2fOONN5LXt1oLASHw/wiw1Xr27Pn333/nzJmza9eus2fPXrdu3Zw5cwYPHly6dGnkRo0aVa9evZ9++gleJATSFoE0cKEPHz588803u+zZVVddNW7cuI8++ujTYx/upi0oeroQEAJCQAikPQIagRBIawSaNWvW2fN59NFHX3nllc8++wyD/ujRo61atVqzZk1aj1HPFwKZAQGcgKeeeoqZFCpUaNmyZf37969atWr+/PmrVKnSoUOHefPmtWnThrsLFix44IEHYERCIG0RSAMX+rXXXnO/8+Rweu+99xo3bly+fPkSxz558uRJFBRiVFu3bl21ahUOeaLCEhACQkAICAEhkKoI6GGZFwFMfEL/5KL/+uuvCRMmZN6JamZCIJUQ+Oeff7p06UJJ/vndd9/Fc/Y9+OSTT8bBrl27NvWvv/762rVrYURCIA0RSAMX+osvvnAT7tWrl+OjZN5+++3q1aufd955ZcqUqVatGkzJkiV79+595MgRbw9z5849/9gHZ9t7K8jfcccdJtukSRN399dff7VKypdfftnVw0yfPp1KIx5NjUgIpB8E9u/fP2TIEHZHgQIFChYsCPP0008fOHAgSSPcs2dPjx49brzxRnrAXqxbt26/fv1+/vnnkJ2sW7eua9euNWvW5Insx6ZNmzKAQ4cO+YR37drF+ecjhPv06fPVV1+FEw75i4/JkydbP0zW15BLotTNmzcnTZQ3b14LYCNP3I1bXiKERydsZ2+l8StXruQWRFdWM2fOHC4jk09RWMNg+ccff0ydOvWWW24pVqzYueeeW6pUKTTP7NmzsR6ccEisfE/v2bOnk4/A8CLo/LHHHuMp3h5CBvJBA1jKlSvHwCpXrty6desPPvjA1zm90U/Dhg199b5LpokY9Mknn7hbbl7B1/r4448jXL9+/S1btjh5mChXF5KiuCGgjhJDoGjRomgYpL788ktKL2GNsMFvuummIkWKoIIqVKhw//33+1a1V54NRXoNRY09c+WVV7Zt23bixIlebeAVfv7559km4cj7BVe6RSzcPkW9c5dneTuHZ/CcFw0aNEA7YeRcd911ODYbN27kVkiaP3++KVs0BphwCowfP/63334LCqNYeKKXGjVqhBZCtQaFrYYpRIPME088QbecUNbKV9arV4+7QT3mE+Mygnbi7rRp0+jnrrvugvdRlOP0tfJdRq+oo3xHjIoBh1sA7ukhFXW4trxZDgW6pYR3ncBs2rSJpUI+jDXPSqhVqxYJsz///JNb0dDy5cvXr1+PJLbEBRdcABOSHnzwweOPP55bjJBSJATSEIE0cKExzW3Cp556KgeG8dGUhHvRtmhhdprbuhwz33zzzfDhw//zn/98//33rp+jR4/+cuwTNJ2dmDGksk3WdUs9PVslpVcLkPru0KEDlRDWeTitTQ8iIZD6COzduxdTbODAgSzUgwcP4jnD9O/fH0vo4MGDUY7n/fffx5IbO3bskiVLaPXDDz9gJw0dOvSaa64J2lLDhg2jnpzMp59+ijD78Z133mEA2FLfffed94mEpfBIfYTwM888c9VVV40ePTqkcNBv37ZtG6rA+uH497aCZzwc8G+99RZi7Ghi1fjP7NnGjRtjoyDgiNnRyc6dO12NMRgo7du35xYEnlb57bffchmZeKIJRyhRTcTs2rVrt3DhQvD5/fffd+zY8d577912222PPPKIa4hSivws7q5YscLJh2M2b97MeqBzHFSeQitHPtMfhdaiRYuWLVsSpsQYAljiGliN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EBACmRcBzUwICAEhIASEgBAQAkJACMQNAbnQcYNSHQkBISAE4o2A+hMCQkAICAEhIASEgBBIXwjIhU5f70OjEQJCQAhkFgQ0DyEgBISAEBACQkAIZEIE5EJnwpeqKQkBISAEhEDyEFBrISAEhIAQEAJCQAiERkAudGhcVCsEhIAQEAJCIGMioFELASEgBISAEBACKYiAXOgUBFddCwEhIASEgBAQAklBQLJCQAgQTTanAAAQAElEQVQIASEgBNI7AnKh0/sb0viEgBAQAkJACAiBjICAxigEhIAQEAJZAgG50FniNWuSQkAICAEhIASEgBAIj4DuCAEhIASEQLQIpBcX+vDhw5s2bfr111+jGfhvv/22cePGFStW7N27959//ommyU8//bRy5coDBw5EI5xqMt9///2XX365f//+aJ549OhRZg399ddf0chLRggIASEgBISAEBACWQABTVEICAEhkKoIpIELffPNN1+Q8Gnfvj1zfe+99ypVqnTeeeeVK1eOslq1atRQH5I+//zzW2+9FbHy5ctfc801hQsXLlWq1LBhw3AvQ8rjcCJfpEiRCy+88Oqrry5YsGDx4sWbNGmydevWkPJ169Y9P+Ln999/dw1vvPFGk+3evburNGbdunUFChSwuwMHDrRKV3KXB1100UVFixatUaMGTKFChZo1a7Znzx4n45i///57xIgRlStXzpcvH7OG6Ja5Dx8+3Mk4xg2pQ4cOrtKYZcuW0dBo+fLlVklJ2MIqKd944w1qvDRx4kTqjT766CN3q3///lZ51VVXuUpjCHBUrFjR7taqVcsqVUaJwFNPPVW7du3evXsj/8MPPzzwwANXXnll3rx5WectW7ZctWoV9SHpyJEjU6dOvemmm1jtyFeoUOH+++/fsmVLSGEqWYRdu3atWbMmC7VkyZJNmzYdMmTIoUOHuBWkpUuXMqpwtGDBAtdk9uzZiDVs2NDVeJkePXpwt23btt5K46dPn96sWTOUwLnnnstqb9269QcffGC3fOXRo0fHjh175513XnHFFSyz6667jpl6F6eTf+KJJ3hcv379XI1jwJZbkA/SCE1++eUXlAlNRo0a5frZtWsXNdCGDRtcpWMmT57MLSjKMJlrKEYICAEhIASyDAKaqBAQAhkPgTRwobFEf0744Gs9//zzOLTr1693yWQs2ttvv/39998PYvnZ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yDMW4HKhM9b70miFgBAQAkIgpRFQ/0JACAgBIZClEci4udyMO/KMteDkQmes96XRCoGURaBfv35du3adN29eyj5GvQsBIZBSCKjflELgzz//3Jbw+e2331LqGfHo9+WXX0aNjx07Nh6dqQ8hkEUR+Ctd/v3taF5Gxh15NLNLPzJp4EK/++67dZP42bdvX/qBTCMRAimHwOuvv16oUKEzzjjDt0W6dOnCrV27dqXco63nqVOnjhs3bsWKFXapUggIASGQigikx0cdPHhw+PDhZcuWPeecc0onfPLmzXvNNdeMHj06ZLZn/fr1KHDUeLFixWActWzZ8oUXXli3bt0///yTovP86KOPUOOzZ89O0aeocyEgBIRAVkYgDVxo3ID5SZ406H4AABAASURBVPzoa/1ZeY1mqbmT4fjhhx+Ysm+LjB8/vlWrVsWLF8cIS3588emnn3744YfffPNNHiQSAkJACAiBcAgsXry4VKlSvXv33rJly99//+3EiDM++OCD9erV+/HHH49V/vf/Bw4cQIFz8d1338E4mj59+v3333/llVdWrlx57969CCSHpMaTg57aCoGUQGD16tXPPfdcr169eiZ8vvnmm5R4ivpMJwikgQudTmauYQiB9IzAAM8Hd/f222/Pnz8/A8YIw4sOmfrgbpQ0efLkkSNHkqmIUl5iQkAICIEsiMCcOXNwknGJs2XL1rBhwzfeeGPVqlWffPLJs88+e8sttwDIwoULr7766jVr1sAHCRmnyPv160cYlBw2YiSia9WqtWfPHviYKd5qPOaBqKEQEAL/IvDkk0+iLh5//PEpU6ZMS/js37//3xv6L5MikMYu9OjRo0mFhaTmzZtnUsw1LSGQCAInnXRSZ8+HXAdxzeXLl3fo0IGW7BfMMhiREBACQkAIpBACeM6o3D/++OPUU0996623JkyYcN1111188cWXX355ixYtpk6diiN9yimn7Ny584477kAsOAyPFu/crVu3YcOGLVq0aNy4cSeeeOKGDRsIjAabqCYmBNRICKQxAuvXrx8zZsw///zTrFmz8ePHY6dBRYsWTeNh6fEpiUAau9BVqlT5T5hPkSJFop84q3ZXwsf7Pavom6eOJOfx6tWr165de/DgwSQ98fDhw5s2bfr111+T1ErCmQyBHDlyPPbYY5UrV2ZekyZNOnLkCIxICAgBISAEUgKBRx991H5W8+KLL1avXj34CBzp/v37U79jx46JEyfCREONGzfu2rUrkl988cXKlSthRFkbAc0+MyCwdOlSPJELL7wQvVGjRo0yCR+ib5lhbppDGATS2IUOM6pI1fPmzbvg2Gfz5s379u3jNDrvvPOKJ3zOP//87t27B3+bxDnHLeiqq67y9f7bb79VrFiRW1CtWrXc3blz51LjiEt3y8t8//33BQsWdGKctd67xr/22mvVqlVDjKcTNShQoMC111779ttv211vefPNN9vk2rdvT/17771XqVIlZleuXDlKOqGGei/hWrunv/zyy95bQZ6ouQmzz4N3VZPOETj++OMbNWrEIPfv3799+3YYVHbTpk1r1649evRoLoO0YMEC7kIsVJrAQLt370bygw8+gIfItHAZpOnTp7dp06ZEiRLsrbvvvpu1HS5E9fPPP48dO5YUTeHChfPmzVu2bNmWLVsuWbIk2CeGJk+05U046ZFHHsE2ZU1WrVr1vvvui/6bjU888QT99OvXz/eIrVu31qtXj1uDBw/23jp69CgjvPPOO6+44goex1Dvv//+kF9lT2rP3qf4eEJmRKM7depUp04dhuToyy+/9Eky8R49etx4441oiUKFCtWtW5epgapPjPA2nfBefPW+S9JliN17773e+jjOC6371FNPXXPNNWTk8uXLV758+Y4dO65atcr7OONnz57NSCLTlClTTJiSQKgJk6Pj0keTJ0+2u6x/3y0uWerNmzcvXbo0KxA1y6pGPrhik4+hjcFKFhtz5y2HC2mtW7eOE6pmzZqo/ZIlS7JbhwwZcujQIQYckjZt2tSlSxcgZRZkMDiSOD7+/PNPJ0xze3SEMuS7cD2IiQYBMJ82bRqSKKhbEr6zDR+ku+66i6OZ+uDRTGU4wou2W04VEB7lhZpitFvekgVvOgQ7JKlq/LPPPnvggQfYERdddFHDhg1ZP0EDyZ6FwkFJohtTTY2bfmBUNgBfiUoEk7Zt23rrI+xf0oDIQ9999501YbJcRibfZkl0A1rP3377rXXLQ6l59913uQQ3tjmK8bnnnsOwpN5LTrkhGY4efPBBbxPULJK9e/emkmgO7/HKK69EM5QqVYoT1jdyZByhjqZOnXrTTTeRi0K+QoUKnHdbtmxxAtEMpmfPnk4+POzHEQZikBAa2Mm///771NSrV48aBjNixAiMXoxb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ejTHf4u8/R49esyfP+xZhsgAABAASURBVJ8t6NGjR3t/EjjydnwsmT9/fh9bS2ZTjuYEI/ApCu3/adVk6pAX+so8Fzov3BWNUQSiIlC8eHFmdMdo/ksfEUgZAXUsAiIQCwE27ipXrswuXCyVVUcEMpxAqVKl2HlOq++W8kpmKFRHc7ajkQwdRfqrLRc6/e+RNBQBERABEUgCAXUhAiIgAiIgAn8TYFvCr3+v5O/mkvUfOqN5snrL0/3Ihc7Tt1+DFwEREAERyAoCGoQIiIAIiICfBAoXLpzQP3f3U9ecttAWnXOSOiScgFzohCNWByIgAiIgAiIgAqEJ6IoIiIAIpCOBokWLsq+bjpp5dEJPtPVkKyNRBORCJ4qs2hUBERABERABEch2AhqfCIhANhNgX7dYsWI4qOn5d8VohW5oiJ7ZfBvSb2xyodPvnkgjERABERABERABEUg4AXUgAiKQO4H8+fPjoBYvXrxE+n3QCt3QMPdhqISvBORC+4pTjYmACIiACIiACIiACCScgDoQAREQgZQRkAudMvTqWAREQAREQAREQAREIO8R0IhFQAQym4Bc6My+f9JeBERABERABERABERABJJFQP2IgAj8Sy60HgIREAEREAEREAEREAEREIGsJ6ABioA/BORC+8NRrYiACIiACIiACIiACIiACIhAYgio1TQiIBc6jW6GVBEBERABERABERABERABERCB7CKQbaORC51td1TjEQEREAEREAEREAEREAEREAER8INAkDbkQgeBoiwREAEREAEREAEREAEREAEREAER8BLIHBfaq7tyRCBLCezdu3fHjh1btmzZnJYfFEM9lPQFP+3QGm0mbaz0RY/064v+akQERCBbCWAlsBVYDFmnbL3FGpcIiIAIxEZALnRs3KKspeIiEDEBVmxbt27dvXv3vn37Iq6U1IIohnooiapxdkwLtENrtBlnU5FXpy96pF96j7yWSoqACOQpAtgHrAS2AouRtIHTFz3SL70nrVN1JAIiIAIiEC0BudDREst75TXiJBLYtm0b66ckdhhXV6iKwjE3QV1aiLl6/BXpHR3ib0ctiIAIZBkBLAP2IYWDond0SKEC6loEREAERCAMAbnQYeDoUuYTyKgRsO2wZ8+ejFL5XyiM2jHoTC3qxlDR3yrogCb+tqnWREAEMpoANgHLkPIhoAOapFwN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iIAIiIAIiIAIiEDyCOCo4q7itNIlDixuLAnfJSIXml4PP/xwnHgSbIivXLkSzXbs2IGK5EhEQASyjoAGJAIiIAIiIAIiIAIiIAKZQQC3FOcUFxVHFXcVpXFdcWBJJEIidaHpGye+QoUKRXJ+XQzNfvrpJ1Rcqo8I5FUCvBRIXh19Oo9buomACOQhAthhJA8NWEMVAREQARHwEMAtxTnFRWVGwF3FacV1JZ0gicKFRoOCBQuWLVsWndgWL1SoUL58+ciUiIAIiIAI+ERAzYiACIiACIiACIiACERHALcU5xQXFUcVdxWnNbr6UZaOzoW2xtGJbfGjjjqqUqVKVfURAREQAREQgb8J6D8REAEREAEREAERSAEB3FKcU1xUHFXzWBN6jMWFTqhCalwEREAEREAEkk5AHYqACIiACIiACIhARATkQkeESYVEQAREQAREIF0JSC8REAEREAEREIHkEZALnTzW6kkEREAEREAEROCfBHQmAiIgAiIgAhlGQC50ht0wqSsCIiACIiACIpAeBKSFCIiACIhAXiQgFzov3nWNWQREQAREQAREIG8T0OhFQAREQARiJCAXOkZwqiYCIiACIiACIiACIpAKAupTBERABFJJQC50KumrbxEQAREQAREQAREQgbxEQGMVARHIeAJyoTP+FmoAIiACIiACIiACIiACIpB4AupBBETgbwJyof+moP9EQAREQAREQAREQAREQASyl4BGJgK+EZAL7RtKNSQCIiACIiACIiACIiACIiACfhNQe+lFQC50et0PaSMCIiACIiACIiACIiACIiAC2UIgC8chFzoLb6qGJAIiIAIiIAIiIAIiIAIiIAIiEB+B4LXlQgfnolwREAEREAEREAEREAEREAEREAERCCCQIS50gNY6FQEREAEREAEREAEREAEREAEREIGkE5ALnXjk6kEEREAEREAEREAEREAEREAERCArCMiFzorbmLhBqGUREAEREAEREAEREAEREAEREIH9BORC7yeh/2cfAY1IBERABERABERABERABERABHwlIBfaV5xqTAT8IqB2REAEREAEREAEREAEREAE0o+AXOj0uyfSSAQynYD0FwEREAEREAEREAEREIEsJSAXOktvrIYlAiIQGwHVEgEREAEREAEREAEREIHQBORCh2ajKyIgAiKQWQSkrQiIgAiIgAiIgAiIQIIJyIVOMGA1LwIiIAIiEAkBlREBERABERABERCBTCDw/wAAAP//ZO2FtAAAAAZJREFUAwAp8U+yjdATVwAAAABJRU5ErkJggg==" + } + }, + "cell_type": "markdown", + "id": "aba578ce", + "metadata": {}, + "source": [ + "# Введение в Python и CPython\n", + "1. Что такое CPython и чем он отличается от Python?\n", + "- Python - это название языка программирования, а CPython - конкретный интерпретатор, который выполняет Python-код \n", + "![image.png](attachment:image.png)\n", + "3. Сколько существует реализаций Python, и какая из них самая популярная?\n", + "- 6, самая популярная CPython\n", + "4. На каком языке написан CPython?\n", + "- На языке C\n", + "# Поиск и установка CPython\n", + "\n", + "5. (опционально) Кто создал CPython?\n", + "- Гвидо Ван Россум\n", + "6. Почему Python считается быстрым, несмотря на то, что это интерпретируемый язык?\n", + "- Во-первых, он написан на C, во-вторых, он считается быстрым не столько в плане исполнения, сколько в плане разработки на нём\n", + "7. Напишите путь к Интерпретатору CPython на вашем компьютере\n", + "- C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python310\n", + "# Структура CPython\n", + "\n", + "8. Что содержится в папке include в CPython?\n", + "- В ней содержатся заголовочные файлы, необходимые для разработки и сборки C-расширений для Python\n", + "9. Где можно найти исходный код CPython дайте ссылку на репозиторий гитхаб\n", + "- https://github.com/python/cpython\n", + "10. (опционально) Как работает интерпретатор CPython при выполнении кода?\n", + "- Cpython работает в 4 этапа: 1. Лексический анализ. 2. Синтаксический анализ. 3. Компиляция в байт-код. 4. Исполнение байт-кода\n", + "# Запуск файла с помощью CPython\n", + "\n", + "11. Какая команда используется для запуска файла с помощью CPython?\n", + "- python filename.py\n", + "12. Можно ли запускать текстовые файлы через интерпретатор Python? Почему?\n", + "- Можно, потому что ему неважно, какой формат файла\n", + "13. Как указать путь к интерпретатору и файлу для выполнения кода?\n", + "- Открыть терминал и ввести <путь до интерпретатора> <пробел> <путь до файла>\n", + "# Введение в PyPy\n", + "\n", + "14. Чем PyPy отличается от CPython?\n", + "- Он работает в 10 раз быстрее\n", + "15. Почему PyPy не может использоваться для всех проектов на Python?\n", + "- Потому что он достаточно новый и ещё не совместим со всеми проектами \n", + "16. Где можно скачать PyPy?\n", + "- htttps://pypy.org\n", + "# Установка и запуск PyPy\n", + "\n", + "17. Как установить PyPy после скачивания?\n", + "- Разархивировать скачанный архив в удобное место\n", + "18. Как запустить файл с помощью PyPy?\n", + "- Скопировать путь до интерпретатора PyPy и путь до файла в терминала\n", + "19. Почему PyPy выполняет код быстрее, чем CPython?\n", + "- PyPy быстрее Cpython благодаря JIT-компилятору (Just-In-Time).\n", + "Как это работает:\n", + "\n", + "1. Интерпретация: Сначала PyPy, как и CPython, интерпретирует байт-код.\n", + "\n", + "2. Анализ (\"разогрев\"): Во время выполнения JIT-компилятор анализирует \"горячий\" код - участки, которые выполняются много раз (например, циклы).\n", + "\n", + "3. Компиляция в машинный код: Эти горячие участки на лету компилируются в оптимизированный машинный код, который процессор выполняет напрямую, без дальнейшей интерпретации.\n", + "\n", + "CPython же всегда интерпретирует байт-код, что медленнее выполнения скомпилированного машинного кода.\n", + "\n", + "Итог: PyPy жертвует скоростью запуска на анализ, но выигрывает в скорости выполнения долгоработающих программ.\n", + "\n", + "# Практические задания\n", + "Задание 1: Поиск и установка CPython\n", + "\n", + "Проверьте, установлен ли CPython на вашем компьютере:\n", + " Используйте поиск в меню \"Пуск\" (Windows) или терминале (Linux/Mac).\n", + " Введите команду python --version или python3 --version в терминале.\n", + "Если CPython не установлен, скачайте его с официального сайта Python https://www.python.org/downloads/ и установите.\n", + "- Установлен, версия Python 3.13.1\n", + "\n", + "Задание 2: Исследование структуры CPython\n", + "\n", + "Найдите папку, где установлен Python (например, через команду which python в терминале или свойства ярлыка).\n", + "Откройте папку include и изучите её содержимое. Какое количество файлов на C там есть?\n", + "- Около 100-150 файлов в зависимости от версии\n", + "Перейдите на [GitHub-репозиторий CPython](https://github.com/python/cpython) и найдите файл README. Прочитайте информацию о проекте.\n", + "- Прочитал\n", + "\n", + "Задание 3: Запуск файла с помощью CPython\n", + "\n", + "Создайте текстовый файл example.txt с содержимым:\n", + "print(\"Hello from CPython!\")\n", + "\n", + "Запустите файл через команду python <путь_до_файла> (замените <путь_до_файла> на фактический путь к вашему файлу).\n", + "Проверьте, что выводится на экран. Попробуйте изменить расширение файла на .py и повторите запуск.\n", + "- Создал и запустил, отработало как с расширением .txt, так и с .py\n", + "\n", + "Задание 4: Установка и использование PyPy\n", + "\n", + "Перейдите на [официальный сайт PyPy](https://www.pypy.org/) и скачайте подходящую версию для вашей операционной системы.\n", + "Распакуйте скачанный архив в удобное место.\n", + "Создайте файл example_pypy.txt с кодом:\n", + "print(\"Hello from pypy!\")\n", + "\n", + "Запустите файл через PyPy\n", + "pypy <путь_до_файла> (замените <путь_до_файла> на фактический путь к вашему файлу).\n", + "Проверьте, что выводится на экран. Попробуйте изменить расширение файла на .py и повторите запуск.\n", + "- Создал и запустил, отработало как с расширением .txt, так и .py\n", + "\n", + "Задание 5: Сравнение производительности CPython и PyPy\n", + "\n", + "Создайте файл performance_test.py с кодом:\n", + " import time\n", + " start_time = time.time()\n", + " total = 0\n", + " for i in range(1, 10000000):\n", + " total += i\n", + " end_time = time.time()\n", + " \n", + " print(\"Result:\", total)\n", + " print(\"Execution time:\", end_time - start_time, \"seconds\")\n", + "\n", + "- CPython: Result: 49999995000000; Execution time: 1.0441670417785645 seconds\n", + "- PyPy: Result: 49999995000000; Execution time: 0.046868324279785156 seconds\n", + "- Видно, что PyPy ощутимо быстрее" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python/cpython.py b/python/cpython.py new file mode 100644 index 00000000..77048533 --- /dev/null +++ b/python/cpython.py @@ -0,0 +1,116 @@ +"""cpython.""" + +# # Введение в Python и CPython +# 1. Что такое CPython и чем он отличается от Python? +# - Python - это название языка программирования, а CPython - конкретный интерпретатор, который выполняет Python-код +# ![image.png](attachment:image.png) +# 3. Сколько существует реализаций Python, и какая из них самая популярная? +# - 6, самая популярная CPython +# 4. На каком языке написан CPython? +# - На языке C +# # Поиск и установка CPython +# +# 5. (опционально) Кто создал CPython? +# - Гвидо Ван Россум +# 6. Почему Python считается быстрым, несмотря на то, что это интерпретируемый язык? +# - Во-первых, он написан на C, во-вторых, он считается быстрым не столько в плане исполнения, сколько в плане разработки на нём +# 7. Напишите путь к Интерпретатору CPython на вашем компьютере +# - C:\Users\user\AppData\Local\Programs\Python\Python310 +# # Структура CPython +# +# 8. Что содержится в папке include в CPython? +# - В ней содержатся заголовочные файлы, необходимые для разработки и сборки C-расширений для Python +# 9. Где можно найти исходный код CPython дайте ссылку на репозиторий гитхаб +# - https://github.com/python/cpython +# 10. (опционально) Как работает интерпретатор CPython при выполнении кода? +# - Cpython работает в 4 этапа: 1. Лексический анализ. 2. Синтаксический анализ. 3. Компиляция в байт-код. 4. Исполнение байт-кода +# # Запуск файла с помощью CPython +# +# 11. Какая команда используется для запуска файла с помощью CPython? +# - python filename.py +# 12. Можно ли запускать текстовые файлы через интерпретатор Python? Почему? +# - Можно, потому что ему неважно, какой формат файла +# 13. Как указать путь к интерпретатору и файлу для выполнения кода? +# - Открыть терминал и ввести <путь до интерпретатора> <пробел> <путь до файла> +# # Введение в PyPy +# +# 14. Чем PyPy отличается от CPython? +# - Он работает в 10 раз быстрее +# 15. Почему PyPy не может использоваться для всех проектов на Python? +# - Потому что он достаточно новый и ещё не совместим со всеми проектами +# 16. Где можно скачать PyPy? +# - htttps://pypy.org +# # Установка и запуск PyPy +# +# 17. Как установить PyPy после скачивания? +# - Разархивировать скачанный архив в удобное место +# 18. Как запустить файл с помощью PyPy? +# - Скопировать путь до интерпретатора PyPy и путь до файла в терминала +# 19. Почему PyPy выполняет код быстрее, чем CPython? +# - PyPy быстрее Cpython благодаря JIT-компилятору (Just-In-Time). +# Как это работает: +# +# 1. Интерпретация: Сначала PyPy, как и CPython, интерпретирует байт-код. +# +# 2. Анализ ("разогрев"): Во время выполнения JIT-компилятор анализирует "горячий" код - участки, которые выполняются много раз (например, циклы). +# +# 3. Компиляция в машинный код: Эти горячие участки на лету компилируются в оптимизированный машинный код, который процессор выполняет напрямую, без дальнейшей интерпретации. +# +# CPython же всегда интерпретирует байт-код, что медленнее выполнения скомпилированного машинного кода. +# +# Итог: PyPy жертвует скоростью запуска на анализ, но выигрывает в скорости выполнения долгоработающих программ. +# +# # Практические задания +# Задание 1: Поиск и установка CPython +# +# Проверьте, установлен ли CPython на вашем компьютере: +# Используйте поиск в меню "Пуск" (Windows) или терминале (Linux/Mac). +# Введите команду python --version или python3 --version в терминале. +# Если CPython не установлен, скачайте его с официального сайта Python https://www.python.org/downloads/ и установите. +# - Установлен, версия Python 3.13.1 +# +# Задание 2: Исследование структуры CPython +# +# Найдите папку, где установлен Python (например, через команду which python в терминале или свойства ярлыка). +# Откройте папку include и изучите её содержимое. Какое количество файлов на C там есть? +# - Около 100-150 файлов в зависимости от версии +# Перейдите на [GitHub-репозиторий CPython](https://github.com/python/cpython) и найдите файл README. Прочитайте информацию о проекте. +# - Прочитал +# +# Задание 3: Запуск файла с помощью CPython +# +# Создайте текстовый файл example.txt с содержимым: +# print("Hello from CPython!") +# +# Запустите файл через команду python <путь_до_файла> (замените <путь_до_файла> на фактический путь к вашему файлу). +# Проверьте, что выводится на экран. Попробуйте изменить расширение файла на .py и повторите запуск. +# - Создал и запустил, отработало как с расширением .txt, так и с .py +# +# Задание 4: Установка и использование PyPy +# +# Перейдите на [официальный сайт PyPy](https://www.pypy.org/) и скачайте подходящую версию для вашей операционной системы. +# Распакуйте скачанный архив в удобное место. +# Создайте файл example_pypy.txt с кодом: +# print("Hello from pypy!") +# +# Запустите файл через PyPy +# pypy <путь_до_файла> (замените <путь_до_файла> на фактический путь к вашему файлу). +# Проверьте, что выводится на экран. Попробуйте изменить расширение файла на .py и повторите запуск. +# - Создал и запустил, отработало как с расширением .txt, так и .py +# +# Задание 5: Сравнение производительности CPython и PyPy +# +# Создайте файл performance_test.py с кодом: +# import time +# start_time = time.time() +# total = 0 +# for i in range(1, 10000000): +# total += i +# end_time = time.time() +# +# print("Result:", total) +# print("Execution time:", end_time - start_time, "seconds") +# +# - CPython: Result: 49999995000000; Execution time: 1.0441670417785645 seconds +# - PyPy: Result: 49999995000000; Execution time: 0.046868324279785156 seconds +# - Видно, что PyPy ощутимо быстрее From 0befb8720250162e5775780882aae862193f09bd Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Thu, 18 Sep 2025 19:40:39 +0300 Subject: [PATCH 10/14] [TASK] Cpython #4 (https://github.com/SENATOROVAI/intro-cs/issues/4) Closes https://github.com/SENATOROVAI/intro-cs/issues/4 --- python/cpython.ipynb | 2 +- python/cpython.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/cpython.ipynb b/python/cpython.ipynb index 91db012b..74c558f6 100644 --- a/python/cpython.ipynb +++ b/python/cpython.ipynb @@ -11,7 +11,7 @@ }, "outputs": [], "source": [ - "\"\"\"cpython.\"\"\"" + "\"\"\"Task cpython.\"\"\"" ] }, { diff --git a/python/cpython.py b/python/cpython.py index 77048533..fd037f65 100644 --- a/python/cpython.py +++ b/python/cpython.py @@ -1,4 +1,4 @@ -"""cpython.""" +"""Task cpython.""" # # Введение в Python и CPython # 1. Что такое CPython и чем он отличается от Python? From 4760de269ae17bc10093206c7564c84347a8972c Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Thu, 18 Sep 2025 23:35:03 +0300 Subject: [PATCH 11/14] [TASK] Cpython #4 (https://github.com/SENATOROVAI/intro-cs/issues/4) Closes https://github.com/SENATOROVAI/intro-cs/issues/4 --- python/cpython.ipynb | 2 +- python/cpython.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/cpython.ipynb b/python/cpython.ipynb index 74c558f6..8a79915e 100644 --- a/python/cpython.ipynb +++ b/python/cpython.ipynb @@ -11,7 +11,7 @@ }, "outputs": [], "source": [ - "\"\"\"Task cpython.\"\"\"" + "\"\"\"Block python.\"\"\"" ] }, { diff --git a/python/cpython.py b/python/cpython.py index fd037f65..5b2951c9 100644 --- a/python/cpython.py +++ b/python/cpython.py @@ -1,4 +1,4 @@ -"""Task cpython.""" +"""Block python.""" # # Введение в Python и CPython # 1. Что такое CPython и чем он отличается от Python? From 641e75a3319da722ae21b87d234fa95ddedf9631 Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Fri, 19 Sep 2025 00:00:22 +0300 Subject: [PATCH 12/14] [TASK] Cpython #4 (https://github.com/SENATOROVAI/intro-cs/issues/4) Closes https://github.com/SENATOROVAI/intro-cs/issues/4 --- python/cpython.ipynb | 2 +- python/cpython.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/cpython.ipynb b/python/cpython.ipynb index 8a79915e..8b1af758 100644 --- a/python/cpython.ipynb +++ b/python/cpython.ipynb @@ -11,7 +11,7 @@ }, "outputs": [], "source": [ - "\"\"\"Block python.\"\"\"" + "\"\"\"Block cpython.\"\"\"" ] }, { diff --git a/python/cpython.py b/python/cpython.py index 5b2951c9..61794679 100644 --- a/python/cpython.py +++ b/python/cpython.py @@ -1,4 +1,4 @@ -"""Block python.""" +"""Block cpython.""" # # Введение в Python и CPython # 1. Что такое CPython и чем он отличается от Python? From b1760865cd5764d5020a318c021da8330056ebd4 Mon Sep 17 00:00:00 2001 From: Ruslan Senatorov <55090151+ruslansenatorov@users.noreply.github.com> Date: Fri, 19 Sep 2025 00:15:16 +0300 Subject: [PATCH 13/14] Update CODEOWNERS Signed-off-by: Ruslan Senatorov <55090151+ruslansenatorov@users.noreply.github.com> --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index d247a7b9..20ffd29f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -@senatorovai/senatorov-main +* @senatorovai/senatorov-main From 634a8e263bed9ccdc29aed52e494e56b6d6a0c34 Mon Sep 17 00:00:00 2001 From: smrnvdn <99199354+smrnvdn@users.noreply.github.com> Date: Fri, 19 Sep 2025 00:36:46 +0300 Subject: [PATCH 14/14] [TASK] Cpython #4 (https://github.com/SENATOROVAI/intro-cs/issues/4) Closes https://github.com/SENATOROVAI/intro-cs/issues/4 --- python/cpython.ipynb | 2 +- python/cpython.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/cpython.ipynb b/python/cpython.ipynb index 8b1af758..e264d1be 100644 --- a/python/cpython.ipynb +++ b/python/cpython.ipynb @@ -11,7 +11,7 @@ }, "outputs": [], "source": [ - "\"\"\"Block cpython.\"\"\"" + "\"\"\"Block Cpython.\"\"\"" ] }, { diff --git a/python/cpython.py b/python/cpython.py index 61794679..faa7970b 100644 --- a/python/cpython.py +++ b/python/cpython.py @@ -1,4 +1,4 @@ -"""Block cpython.""" +"""Block Cpython.""" # # Введение в Python и CPython # 1. Что такое CPython и чем он отличается от Python?