From 3442fb8d617564e6c0d30fa07119e0c39d925f5f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mi=D1=81hael=20Belvedersky?=
Date: Tue, 10 Sep 2024 14:03:07 +0300
Subject: [PATCH 1/4] research project's description is updated
---
Projects/Projects1/project_descriptions.md | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/Projects/Projects1/project_descriptions.md b/Projects/Projects1/project_descriptions.md
index 755ff59c..30ecf721 100644
--- a/Projects/Projects1/project_descriptions.md
+++ b/Projects/Projects1/project_descriptions.md
@@ -9,17 +9,21 @@
Ваша работа будет оцениваться по следующим критериям:
-- **Техническое выполнение - 5 баллов**: правильность, полнота и сложность кода.
+- **Техническое выполнение - 4 балла**: правильность, полнота и сложность кода.
+- **Воспроизводимость - 1 балл**: код воспроизводится без дополнительных настроек. Датасеты общим размером менее ~90 Мб находятся в репозитории, ссылки на датасеты большего размера приведены в ридми. Пакеты импортируются в начале скрипта/тетради.
- **Оформление и документация - 4 балла**: качественное, хорошо размеченное ридми на гитхабе, документация кода в виде комментариев в коде и докстрингов к функциям.
-- **Читаемость кода - 2 балла**: разумно названные переменные, форматирование кода согласно PEP 8 (проще
+- **Читаемость кода - 2 балла**: разумно названные переменные, форматирование кода согласно PEP8 (проще
всего — используя линтер), отсутствие сложносочиненных конструкций, простота и лаконичность кода.
- **Эффективность кода - 2 балла**: эффективность работы алгоритмов, отсутствие ненужных усложнений.
-Можно использовать модули и библиотеки, изученные за пределами курса, но это не будет оцениваться выше. Если вам удобно использовать другие инструменты и библиотеки, вы можете их использовать, главное — понимание того, что вы используете.
+Можно использовать модули и библиотеки, изученные за пределами курса, но это не будет оцениваться выше. Если вам удобно использовать другие инструменты и библиотеки, вы можете их использовать, главное — понимание того, что вы используете. Перед отправкой проекта убедитесь, что ревьюеру потребуется приложить минимум усилий для запуска проекта на своем компьютере — это сократит время на проверку и сохранит душевное спокойствие проверяющего.
# Типы проектов
## Исследование
-Возьмите датасет и получите какие-нибудь аналитические значения из этого датасета. Это может быть одно-два сложных или несколько простых значений. Это могут быть, например, самые популярные фильмы из базы данных, общее количество фильмов, среднее значение оценки фильмов, количество оценок фильмов, среднюю оценку фильмов в промежутке между годом n и годом m. Исследование должно быть оформлено в виде одного или нескольких `jupyter notebook`-ов.
+Извлеките смысл из данных — получите несколько аналитических значений и объедините их в небольшую историю. Этими значениями могут быть, например, самые популярные фильмы, общее количество фильмов, среднее значение оценки фильмов, количество оценок фильмов, средняя оценка фильмов за некоторый период. Сделайте выводы на основе полученных метрик (в последние несколько лет наиболее популярны следующие жанры, кассовые сборы отечественных фильмов выросли на столько-то). Подумайте о том, что читатель должен будет вынести из вашего проекта. Исследование должно быть оформлено в виде одной или нескольких тетрадей `jupyter`.
+
+Пример исследования можно посмотреть [здесь](https://github.com/mbelveder/ru_graduates). Ваше исследование может быть гораздо более простым с технической точки зрения, но должно содержать выводы на основе данных.
+
## Модуль
Часто датасеты имеют один и тот же формат и год за годом обновляются в одинаковом виде. Можно написать ряд вспомогательных функций, которые могут помочь исследователям, работающим с данными в дальнейшем. К примеру, можно превратить неудобно отформатированные данные в данные, разделенные запятой, удобно читаемые разными программами. Крайне желательно оформить модуль в виде `.py` файла(-ов).
## Кусок курсовой
From b5905cb180e465a57aa791f37b3ac638c35141cc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mi=D1=81hael=20Belvedersky?=
Date: Tue, 17 Sep 2024 12:36:41 +0300
Subject: [PATCH 2/4] a bunch of bugs fixed; some clarity improvements
---
Lectures/Lecture3/Lecture3.ipynb | 261 +++++++++++++++++++++----------
1 file changed, 182 insertions(+), 79 deletions(-)
diff --git a/Lectures/Lecture3/Lecture3.ipynb b/Lectures/Lecture3/Lecture3.ipynb
index 1e4dc86e..0606203a 100644
--- a/Lectures/Lecture3/Lecture3.ipynb
+++ b/Lectures/Lecture3/Lecture3.ipynb
@@ -11,16 +11,16 @@
"\n",
"- Обсуждение плана лекции\n",
"- Понятие функции\n",
- "- Примеры функций который мы уже использовали\n",
+ "- Примеры функций, которые мы уже использовали\n",
"- Функции для списков и строк\n",
" - Вопросы?\n",
"- Написание функций своими руками\n",
- "- Понятие объектов в `python`\n",
+ "- Понятие объектов в `Python`\n",
" - Вопросы?\n",
"- Методы\n",
"- Примеры методов списков и строк\n",
" - Вопросы?\n",
- "- Сеты в `python`\n",
+ "- Сеты в `Python`\n",
"- Разбираем задачку из демоверсии независимого экзамена (если успеем)"
]
},
@@ -31,7 +31,7 @@
"source": [
"## **Функции**\n",
"\n",
- "Функции в программировании чем-то похожи на функции в математике: они получают что-то на вход, внутри их происходит какой-то алгоритм, и они *возвращают* какое-то значение. Посмотрим пример из математики:\n",
+ "Функции в программировании похожи на функции в математике: они получают что-то на вход, внутри них происходит какой-то алгоритм, и они *возвращают* какое-то значение. Посмотрим пример из математики:\n",
"\n",
""
]
@@ -41,9 +41,9 @@
"id": "b4b4e23a-77f3-4622-9c73-aa092d1b8321",
"metadata": {},
"source": [
- "Здесь мы знаем что гипотенуза в прямоугольном треугольнике (`h`) зависит от катетов (`x` и `y`). Таким образом, зная значения `x` и `y`, мы, с помощью известного нам алгоритма (нужно возвести `x` и `y` в квадрат, эти квадраты сложить, а потом извлечь из получишейся суммы корень) получить гипотенузу `h`. Таким образом, `h` является *функцией* ее *аргументов* `x` и `y`.\n",
+ "Мы знаем, что гипотенуза в прямоугольном треугольнике (`h`) зависит от катетов (`x` и `y`). Зная значения `x` и `y`, мы, с помощью известного нам алгоритма, можем получить гипотенузу `h` (нужно возвести `x` и `y` в квадрат, эти квадраты сложить, а потом извлечь из получишейся суммы корень). Таким образом, `h` является *функцией* *аргументов* `x` и `y`.\n",
"\n",
- "Давайте посмотрим на примеры из более реальной жизни:\n",
+ "Давайте рассмотрим более прикладные примеры:\n",
"- Вендиговый автомат: в качестве аргументов мы ему передаем деньги и номер ячейки, а как возвращаемое значение получаем баночку кока-колы\n",
"- Подача документов в ВУЗ: в качестве аргументов передаем результаты экзаменов, официальные документы и разные дополнительные достижения, в качестве возвращаемого значения получаем зачисление или отказ\n",
"\n",
@@ -59,16 +59,17 @@
"Наконец, можно воспринимать функции с точки зрения кода: **функции позволяют выполнять блок кода по запросу.**\n",
"\n",
"Давайте посмотрим на примеры функций! Часть примеров вы уже знаете: \n",
- "- `type()` – возвращает тип переменной\n",
- "- `str()` – конвертирует переменную в строку\n",
- "- `int()` – конвертирует переменную в `integer`\n",
+ "- `print()` — выводит символы на экран\n",
+ "- `type()` — возвращает тип переменной\n",
+ "- `str()` — конвертирует переменную в строку\n",
+ "- `int()` — конвертирует переменную в `integer`\n",
"\n",
"Напомним примеры использования:"
]
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 6,
"id": "e474ec25-8c3e-4b76-9ca4-bf775cb3cdac",
"metadata": {},
"outputs": [
@@ -94,7 +95,7 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 7,
"id": "ecd6f841-9083-4e3b-9d88-d35b3b0eb20e",
"metadata": {},
"outputs": [
@@ -123,12 +124,12 @@
"source": [
"## **Функции для списков и строк**\n",
"\n",
- "Функции существуют и для уже известных нам списков и строк. Например, есть функция `sorted`, которая позволяет нам сортировать список:"
+ "Функции существуют и для уже известных нам списков и строк. Например, есть функция `sorted`, которая позволяет сортировать списки:"
]
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 8,
"id": "ac6be99d-4512-4b08-9c27-9742fdbe1516",
"metadata": {},
"outputs": [
@@ -153,7 +154,7 @@
"id": "ea7ae502-94cd-4fc6-9d98-8ca710b3906d",
"metadata": {},
"source": [
- "> ☝ Далеко не обязательно присваивать возвращаемые значения переменным, можно их выводить сразу. Например, `print(type(b))` тоже сработает!"
+ "> ☝ Совсем не обязательно присваивать возвращаемые значения переменным, можно их выводить сразу. Например, `print(type(b))` тоже сработает!"
]
},
{
@@ -161,12 +162,12 @@
"id": "a35eef1a-3b81-45bd-9e3b-d86bbaecd2d9",
"metadata": {},
"source": [
- "Одна из самых полезных функций `len()`, которую мы будем очень часто использовать, позволяет узнать длину *объекта* состоящего из нескольких элеменов (например списка или строки). Посмотрим как оно работает:"
+ "Одна из самых полезных функций — `len()`. Мы будем очень часто использовать ее, ведь эта функция позволяет узнать длину *объекта* (например списка или строки). Посмотрим, как она работает:"
]
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": 9,
"id": "8c656ecb-b985-4c09-b25b-fffbed595ef5",
"metadata": {},
"outputs": [
@@ -197,7 +198,7 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 10,
"id": "a0030a50-496d-4e21-8590-58618bb96d32",
"metadata": {},
"outputs": [
@@ -230,7 +231,7 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 11,
"id": "ff61fb7d-1434-4572-a441-0a95e7138d21",
"metadata": {},
"outputs": [
@@ -259,12 +260,52 @@
" print(sample[i])"
]
},
+ {
+ "cell_type": "markdown",
+ "id": "9ba365f9",
+ "metadata": {},
+ "source": [
+ "> ☝ `len()` удобно использовать, если нужно пройтись в цикле не по всему объекту, а по какой-то из его частей. Для циклического прохождения по всему объекту можно использовать конструкцию `for i in sample: *код*` (`Python` сам понимает, что элементы объекта закончились и больше циклов не требуется)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "ee5dda9d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "H\n",
+ "e\n",
+ "l\n",
+ "l\n",
+ "o\n"
+ ]
+ }
+ ],
+ "source": [
+ "sample = 'Hello world!'\n",
+ "for i in range(len(sample) - 7):\n",
+ " print(sample[i])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7f0974c8",
+ "metadata": {},
+ "source": [
+ "> ☝ Подумайте о том, как для такой же цели можно использовать срезы."
+ ]
+ },
{
"cell_type": "markdown",
"id": "115c3526-ec0b-478f-a3fa-4d8a003c5897",
"metadata": {},
"source": [
- "Помните как мы находили на прошлом практическом занятии максимальный и минимальный элемент списка? Конечно для этого есть свои функции:"
+ "Помните, как мы находили на прошлом практическом занятии максимальный и минимальный элемент списка? Для этого есть специальные функции:"
]
},
{
@@ -292,7 +333,7 @@
"id": "a7605f59-4494-46fb-bb84-60cc7de51e8d",
"metadata": {},
"source": [
- "Есть и функция позволящая искать сумму элементов списка:"
+ "Есть и функция, позволящая искать сумму элементов списка:"
]
},
{
@@ -320,12 +361,12 @@
"id": "912994b1-35a4-43c0-83d5-c07c67c2bb90",
"metadata": {},
"source": [
- "У функций есть опциональные аргументы. Например у `sorted` есть опциональный аргумент `reverse`:"
+ "У функций есть опциональные аргументы. Например, у `sorted` есть опциональный аргумент `reverse`:"
]
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": 13,
"id": "f3284063-5fb3-4bc6-9cb2-4b7486a07a83",
"metadata": {},
"outputs": [
@@ -341,7 +382,8 @@
"source": [
"l = [3, 6.4, 10, 1, -20, 30/4, 1/3]\n",
"\n",
- "l_sorted = sorted(l, reverse=False) # False является значением аргумента по умолчанию (дефолтным)\n",
+ "# False является значением аргумента по умолчанию (дефолтным)\n",
+ "l_sorted = sorted(l, reverse=False)\n",
"l_sorted_reverse = sorted(l, reverse=True)\n",
"\n",
"print('Отсортированный список:', l_sorted)\n",
@@ -356,6 +398,16 @@
"## **Вопросы?**"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "9274d566",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# TODO: уточнить про \"тело\""
+ ]
+ },
{
"cell_type": "markdown",
"id": "c4be87b3-2035-42df-a89d-74d1b90ab67f",
@@ -363,13 +415,13 @@
"source": [
"## **Написание функций своими руками**\n",
"\n",
- "Конечно мы можем и сами писать функции. Давайте посмотрим на синтаксис:\n",
+ "Конечно мы можем и сами писать функции. Давайте посмотрим на синтаксис *определения* (definition) функции:\n",
"\n",
- "``` python\n",
+ "``` Python\n",
"def название(аргумент1, аргумент2):\n",
- " *код внутри функции*\n",
- " *код внутри функции*\n",
- " *код внутри функции*\n",
+ " \n",
+ " *код внутри функции (тело функции)*\n",
+ " \n",
" return возвращаемое_значение\n",
"```\n",
"\n",
@@ -378,7 +430,7 @@
},
{
"cell_type": "code",
- "execution_count": 35,
+ "execution_count": 14,
"id": "f8f05a99-dd48-4b4e-90a2-cf0a06410dad",
"metadata": {},
"outputs": [
@@ -407,13 +459,13 @@
"id": "6ed942e9",
"metadata": {},
"source": [
- "Ключевое слово `return` позволяет нам обозначить возвращаемое значение функции. Таким образом, мы можем написать:\n",
+ "Ключевое слово `return` позволяет нам обозначить возвращаемое значение функции. Это значит, что мы можем написать:\n",
"\n",
"`result = multiply(2, 5)`\n",
"\n",
- "Если бы не написали это ключевое слово, мы бы не смогли достать результат перемножения из функции и записать его в переменную.\n",
+ "Если бы не `return` в конце определения функции, мы бы не смогли достать результат перемножения и записать его в переменную.\n",
"\n",
- "Это подводит нас к другому способу посмотреть на ключевое слово `return` - это способ \"вытаскивать\" переменные из функций."
+ "Это подводит нас к другому способу посмотреть на ключевое слово `return` — это способ \"вытаскивать\" нужные нам значения из функций."
]
},
{
@@ -421,7 +473,7 @@
"id": "fb654464",
"metadata": {},
"source": [
- "> ✨ ☝️ Переменные, которые вы объявлете в функции недоступны вне этой функции. Они называются *локальным*, а переменные объявленные вне функции называются *глобальными*. Постарайтесь не использовать *глобальные* переменные внутри функции: если вам нужно использовать внешнюю переменную, передайте ее как аргумент функции."
+ "> ✨ ☝️ Переменные, которые вы объявлете в функции, недоступны вне этой функции. Они называются *локальным*. Переменные, объявленные вне функции, называются *глобальными*. Постарайтесь не использовать *глобальные* переменные внутри функции: если вам нужно использовать внешнюю переменную, передайте ее как аргумент функции. За состоянием глобальных переменных бывает сложно следить и, как правило, их использование внутри функций приводит к ошибкам."
]
},
{
@@ -436,7 +488,7 @@
},
{
"cell_type": "code",
- "execution_count": 40,
+ "execution_count": 20,
"id": "02cadc80-8414-4c05-b276-42d5fbfe9aad",
"metadata": {},
"outputs": [
@@ -460,7 +512,28 @@
"id": "abb716ae-8451-4a69-9467-8c154f8339f3",
"metadata": {},
"source": [
- "> ☝ Обратите внимание, что даже если наша функция не принимает никаких аргументов, мы все равно должны вызывать ее со скобочками! `hello_world` ничего не выведет, обязательно нужно написать `hello_world()`"
+ "> ☝ Обратите внимание, что даже если наша функция не принимает никаких аргументов, мы все равно должны вызывать ее со скобочками! `hello_world` выведет на экран технические детали об устройстве функции. Чтобы выполнился код в теле функции, обязательно нужно написать `hello_world()`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "f2808a80",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hello_world"
]
},
{
@@ -468,12 +541,12 @@
"id": "92895803-32ce-4390-87e8-ac60802a8c6e",
"metadata": {},
"source": [
- "Конечно мы можем добавить и опциональный аргумент в нашу функцию:"
+ "Можно добавить и опциональный аргумент в нашу функцию:"
]
},
{
"cell_type": "code",
- "execution_count": 168,
+ "execution_count": 27,
"id": "e63fa581-e74e-48c1-99b4-6d86981aa611",
"metadata": {},
"outputs": [
@@ -481,6 +554,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
+ "10\n",
"100\n",
"100\n"
]
@@ -495,6 +569,8 @@
"second = 5\n",
"third = 10\n",
" \n",
+ "# По умолчанию третий множитель не используется\n",
+ "print(multiply(first, second))\n",
"print(multiply(first, second, third)) \n",
"print(multiply(first, second, d=third)) # оба варианта будут работать"
]
@@ -504,9 +580,9 @@
"id": "5117f534-c9a6-45c7-a5ad-868cb5264f2d",
"metadata": {},
"source": [
- "## **Понятия объектов в `python`**\n",
+ "## **Понятия объектов в `Python`**\n",
"\n",
- "На самом деле, большинство переменных и типов данных являются более сложной конструкцией, чем кажутся на самом деле. Почти все что есть в `python` является объектами, и мы немного поговорим об объектно ориентированном подходе через две недели. \n",
+ "На самом деле, большинство переменных и типов данных являются более сложной конструкцией, чем кажутся на самом деле. Почти все, что есть в `Python`, является объектами, и мы немного поговорим об «объектно-ориентированном подходе» через две недели. \n",
"\n",
"## **Методы**\n",
"\n",
@@ -519,7 +595,7 @@
},
{
"cell_type": "code",
- "execution_count": 68,
+ "execution_count": 28,
"id": "06b71361-b394-4d32-ba89-0ff9679609be",
"metadata": {},
"outputs": [
@@ -544,7 +620,7 @@
"id": "a025bf5e-f7dc-4815-9531-7976b3ce1ab3",
"metadata": {},
"source": [
- "> ☝ Обратите внимание, что многие методы не принимают на вход никаких аргументов. Строго говоря, любой метод принимает на вход как минимум один аргумент – объект, откуда к этом методу обратились. "
+ "> ☝ Обратите внимание, что многие методы не принимают на вход никаких аргументов. Строго говоря, любой метод принимает на вход как минимум один аргумент — объект, через который к этом методу обратились."
]
},
{
@@ -552,12 +628,12 @@
"id": "723226a6",
"metadata": {},
"source": [
- "Есть и методы `.isupper()` и `islower()` которые возвращают `True` или `False` в случае если строка состоит только из букв верхнего или нижнего регистра. Похожим образом работают и методы `isalpha()` и `isnumeric()` которые проверяют состоит ли строка из букв или из чисел полностью. Посмотрим на примеры:"
+ "Есть и методы `.isupper()` и `islower()`, которые возвращают `True` или `False` в случае, если строка состоит только из букв верхнего или нижнего регистра соответственно. Похожим образом работают и методы `isalpha()` и `isnumeric()` которые проверяют, состоит ли строка из букв или из чисел полностью. Посмотрим на примеры:"
]
},
{
"cell_type": "code",
- "execution_count": 71,
+ "execution_count": 29,
"id": "43c9a2f6",
"metadata": {},
"outputs": [
@@ -566,15 +642,32 @@
"output_type": "stream",
"text": [
"Полностью ли наша строка Hello world! в верхнем регистре? False\n",
- "Состоит ли наша страка только из букв? False\n",
+ "Состоит ли наша страка только из букв? False\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('Полностью ли наша строка Hello world! в верхнем регистре?', sample.isupper())\n",
+ "print('Состоит ли наша страка только из букв?', sample.isalpha())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "0885ca2a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
"А если мы обрежем последний символ? False Строка выглядит так: Hello world\n",
"А если уберем все символы кроме Hello? True Строка выглядит так: Hello\n"
]
}
],
"source": [
- "print('Полностью ли наша строка Hello world! в верхнем регистре?', sample.isupper())\n",
- "print('Состоит ли наша страка только из букв?', sample.isalpha())\n",
+ "# пробел не является буквой\n",
"print('А если мы обрежем последний символ?', sample[:-1].isalpha(), 'Строка выглядит так:', sample[:-1])\n",
"print('А если уберем все символы кроме Hello?', sample[:-7].isalpha(), 'Строка выглядит так:', sample[:-7])"
]
@@ -589,7 +682,7 @@
},
{
"cell_type": "code",
- "execution_count": 73,
+ "execution_count": 32,
"id": "7a5b09d7",
"metadata": {},
"outputs": [
@@ -610,7 +703,7 @@
"id": "ca1e15ed",
"metadata": {},
"source": [
- "> ☝ Такие методы редко применяются для целей численного анализа, однако полезно знать о их существовании. Впрочем, не обязательно знать о их существовании, можно просто ввести в Google `python как проверить состоит ли строка из букв полностью` и ответ будет в первых ссылках по запросу. Если поискать на английском, то результат будет в первом запросе и будет подсвечен гуглом! Тем не менее, запомните эти методы, на них **есть задачи в демоверсии независимого экзамена по программированию**."
+ "> ☝ Такие методы редко применяются для целей численного анализа, однако полезно знать об их существовании. Но можно просто ввести в поисковик запрос `Python как проверить, состоит ли строка из букв полностью` и ответ будет в первых ссылках выдачи. Тем не менее, запомните эти методы, на них **есть задачи в демоверсии независимого экзамена по программированию**."
]
},
{
@@ -618,14 +711,14 @@
"id": "0c38d4e6-fa9c-4b8f-b467-19e046f29ad0",
"metadata": {},
"source": [
- "В целом, у строк очень [много методов](https://www.w3schools.com/python/python_ref_string.asp), но пожалуй самые полезные это `find()` и `split()`:\n",
+ "В целом, у строк очень [много методов](https://www.w3schools.com/Python/Python_ref_string.asp), но чаще остальных используются `find()` и `split()`:\n",
"\n",
- "`.find()` позволяет найти положение нужного символа или несколькоих символов (*подстроки* или *substring*) в строке. Возвращает этот метод индекс (позицию) этого символа в строке:"
+ "`.find()` позволяет найти положение нужного символа или несколькоих символов (*подстроки* или *substring*) в строке. Метод возвращает индекс (номер позиции) этого символа в строке:"
]
},
{
"cell_type": "code",
- "execution_count": 83,
+ "execution_count": 47,
"id": "cc9401ba-0b31-47c2-9c30-290d3f8ba3c0",
"metadata": {},
"outputs": [
@@ -639,9 +732,11 @@
}
],
"source": [
- "# сделаем строку с огромным количеством английских символов c и спрячем туда одну кириллическую с\n",
+ "# сделаем строку с огромным количеством английских символов `c` и спрячем\n",
+ "# туда одну кириллическую `с`\n",
"ccc = 'c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c с c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c'\n",
- "index = ccc.find('с') # теперь ищем кириллическую с, получаем ее индекс в строке\n",
+ "# теперь ищем кириллическую с, получаем ее индекс в строке\n",
+ "index = ccc.find('с')\n",
"print(index)\n",
"print(ccc[index])"
]
@@ -651,7 +746,7 @@
"id": "7048e0e6-da10-464c-b598-81f1cf12a413",
"metadata": {},
"source": [
- "`.split()` позволяет разделять строки задав разделитель как аргумент. Возвращает этот метод список строк. Например:"
+ "`.split()` позволяет разделять строки, задав разделитель через аргумент. Возвращает этот метод список строк. Например:"
]
},
{
@@ -682,9 +777,9 @@
"source": [
"### Методы списков\n",
"\n",
- "Методы списков позволяют очень удобно добавлять элементы в списки, удалять оттуда элементы и удлиннять их. \n",
+ "Методы списков позволяют очень удобно добавлять элементы в списки, удалять оттуда элементы и удлиннять их.\n",
"\n",
- "Посмотрим, как конкретно это можно делать:"
+ "Посмотрим, как это можно делать:"
]
},
{
@@ -714,12 +809,12 @@
"id": "26fdd8d2-c408-40cb-a296-48ca4709242e",
"metadata": {},
"source": [
- "Типичный случай применения этого метода – создание списков прямо в цикле. Давайте возведем все элементы нашего списка в квадрат:"
+ "Типичный случай применения этого метода — создание списков прямо в цикле. Давайте возведем все элементы нашего списка в квадрат:"
]
},
{
"cell_type": "code",
- "execution_count": 134,
+ "execution_count": 35,
"id": "1117496e-2339-4037-b9ba-d499ed07ca94",
"metadata": {},
"outputs": [
@@ -752,7 +847,7 @@
"\n",
" ☝ ✨✨ Заметка про добавление новых элементов в списки
\n",
"\n",
- "> В `python` списки являются [динамическими массивами](https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2). Это означает, что каждый раз когда мы добавляем туда новый элемент, мы не создаем новый массив и стираем старый, а хитрым образом засовываем новый элемент в уже существующий массив, удлинняя его. Во многих языках массивы стандартно являются статическими, и добавление новых элементов в массив является непростой задачей! \n",
+ "> В `Python` списки являются [динамическими массивами](https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2). Это означает, что каждый раз, когда мы добавляем туда новый элемент, мы не создаем новый массив и стираем старый, а хитрым образом засовываем новый элемент в уже существующий массив, удлинняя его. Во многих языках массивы стандартно являются статическими, и добавление новых элементов в массив реализуется более сложно. \n",
"\n",
" \n",
"
"
@@ -763,12 +858,12 @@
"id": "230e6b3f-b9b2-4aaa-982c-e8bea3983b1f",
"metadata": {},
"source": [
- "А что если нам нужно добавить не один, а несколько элементов в список? Для этого служит метод `.extend()`:"
+ "Что если нам нужно добавить не один, а несколько элементов в список? Для этого служит метод `.extend()`:"
]
},
{
"cell_type": "code",
- "execution_count": 138,
+ "execution_count": 36,
"id": "7c08b0f7-bbd6-48a0-b450-afd3325d457d",
"metadata": {},
"outputs": [
@@ -796,8 +891,8 @@
"metadata": {},
"source": [
"Если вам интересно, посмотрите все методы списков:\n",
- "- [на английском](https://www.w3schools.com/python/python_ref_list.asp)\n",
- "- [на русском](https://pythonworld.ru/tipy-dannyx-v-python/spiski-list-funkcii-i-metody-spiskov.html)"
+ "- [на английском](https://www.w3schools.com/Python/Python_ref_list.asp)\n",
+ "- [на русском](https://Pythonworld.ru/tipy-dannyx-v-Python/spiski-list-funkcii-i-metody-spiskov.html)"
]
},
{
@@ -807,16 +902,20 @@
"source": [
"\n",
"\n",
- " ☝ ✨ Сеты в python
\n",
+ " ☝ ✨ Сеты в Python
\n",
"\n",
- "В `python` есть еще один тип данных, который имеет довольно нишевое использование: они позволяют получить только уникальные элементы из списка. Например:\n",
+ "В `Python` есть еще один тип данных, который имеет довольно нишевое использование. Сеты позволяют получить только уникальные элементы из списка, а также сравнивать разные наборы уникальных элементов друг с другом (находить общие элементы и т. п.). Например:\n",
"\n",
- "``` python\n",
+ "``` Python\n",
"l = [1, 1, 2, 3, 3, 4, 5, 6, 6]\n",
"print(set(l)) # выводит {1, 2, 3, 4, 5, 6}\n",
+ "\n",
+ "b = [5, 6, 7]\n",
+ "# выведем элементы, которые есть в обоих сетах\n",
+ "print(set(l) & set(b)) # выводит {5, 6}\n",
"```\n",
"\n",
- "В целом, это массив, который не позволяет вносить в него изменения и в нем не может быть дубликатов.\n",
+ "Сет — это статический массив, который не позволяет вносить в него изменения и в нем не может быть дубликатов.\n",
"\n",
" \n",
"
"
@@ -838,8 +937,8 @@
"\n",
"Это довольно непростая задача, которую нужно **разбить на несколько сравнительно легких подзадач**. Давайте посмотрим, что нам нужно сделать:\n",
"- Разбить строку на слова по пробелам\n",
- "- Научиться проверять есть ли в произвольном слове хотя бы одна буква в верхнем регистре\n",
- "- Проверить есть ли хотя бы одна буква в верхнем регистре в каждом считанном слове\n",
+ "- Научиться проверять, есть ли в произвольном слове хотя бы одна буква в верхнем регистре\n",
+ "- Проверить, есть ли хотя бы одна буква в верхнем регистре в каждом из слов\n",
"- Добавить в список только те слова, где такие буквы есть\n",
"- Перевести каждое слово в нижний регистр (полностью)\n",
"- Отсортировать полученный список\n",
@@ -855,9 +954,10 @@
"\n",
" Разбить строку на слова по пробелам
\n",
"\n",
- "``` python\n",
+ "``` Python\n",
"\n",
- "sample_str = 'Котик вафЛя ВРАНЬЕ телефон котик КОТ вафля собачька' # если что эту строку не я придумал\n",
+ "# если что, эту строку не я придумал\n",
+ "sample_str = 'Котик вафЛя ВРАНЬЕ телефон котик КОТ вафля собачька'\n",
" \n",
"list_of_words = sample_str.split(' ')\n",
" \n",
@@ -871,7 +971,7 @@
" \n",
" Научиться проверять есть ли в произвольном слове хотя бы одна буква в верхнем регистре
\n",
"\n",
- "``` python\n",
+ "``` Python\n",
"\n",
"word = 'Котик'\n",
"\n",
@@ -890,9 +990,10 @@
"\n",
" Проверить есть ли хотя бы одна буква в верхнем регистре в каждом считанном слове
\n",
"\n",
- "``` python\n",
+ "``` Python\n",
"\n",
- "sample_str = 'Котик вафЛя ВРАНЬЕ телефон котик КОТ вафля собачька' # если что эту строку не я придумал\n",
+ "# если что эту строку не я придумал\n",
+ "sample_str = 'Котик вафЛя ВРАНЬЕ телефон котик КОТ вафля собачька'\n",
" \n",
"list_of_words = sample_str.split(' ')\n",
"\n",
@@ -913,9 +1014,10 @@
"\n",
" Добавить в список только те слова, где такие буквы есть
\n",
"\n",
- "``` python\n",
+ "``` Python\n",
"\n",
- "sample_str = 'Котик вафЛя ВРАНЬЕ телефон котик КОТ вафля собачька' # если что эту строку не я придумал\n",
+ "# если что эту строку не я придумал\n",
+ "sample_str = 'Котик вафЛя ВРАНЬЕ телефон котик КОТ вафля собачька'\n",
" \n",
"list_of_words = sample_str.split(' ')\n",
"\n",
@@ -940,9 +1042,10 @@
"\n",
" Перевести каждое слово в нижний регистр (полностью) отсортировать и вывести
\n",
"\n",
- "``` python\n",
+ "``` Python\n",
"\n",
- "sample_str = 'Котик вафЛя ВРАНЬЕ телефон котик КОТ вафля собачька' # если что эту строку не я придумал\n",
+ "# если что эту строку не я придумал\n",
+ "sample_str = 'Котик вафЛя ВРАНЬЕ телефон котик КОТ вафля собачька'\n",
" \n",
"list_of_words = sample_str.split(' ')\n",
"\n",
@@ -1000,7 +1103,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.5"
+ "version": "3.8.16"
}
},
"nbformat": 4,
From f2af1dc5bde9cd5c01fe3d63c96b987da3c4c2de Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mi=D1=81hael=20Belvedersky?=
Date: Tue, 17 Sep 2024 13:12:36 +0300
Subject: [PATCH 3/4] some bugs are fixed; a bunch of clarity improvements; a
new exercise is added
---
Practices/Practice3/Practice3.ipynb | 117 +++++++++++++++++-----------
1 file changed, 71 insertions(+), 46 deletions(-)
diff --git a/Practices/Practice3/Practice3.ipynb b/Practices/Practice3/Practice3.ipynb
index 4a34398d..d31114fc 100644
--- a/Practices/Practice3/Practice3.ipynb
+++ b/Practices/Practice3/Practice3.ipynb
@@ -23,7 +23,7 @@
"source": [
"## **Основные понятия с лекции**\n",
"\n",
- "## **Вложенные списки**\n",
+ "### Вложенные списки\n",
"\n",
"Элементами списков могут быть другие списки, такие списки называются *вложенными*. Например, вот так будет выглядеть таблица умножения от 4 до 4:"
]
@@ -46,6 +46,7 @@
}
],
"source": [
+ "# TODO: вложенных списков не было в Lecture3.ipynb\n",
"table = [[1, 2, 3, 4],\n",
" [2, 4, 6, 8],\n",
" [3, 6, 9, 12],\n",
@@ -58,22 +59,23 @@
"id": "b64e1fa6-8d6e-4637-8f1f-8d66fe203c00",
"metadata": {},
"source": [
- "## **Функции**\n",
+ "### Функции\n",
"\n",
"Функции можно описать следующей схемой:\n",
"\n",
"\n",
"Примеры функций:\n",
- "- `type()` – возвращает тип переменной\n",
- "- `str()` – конвертирует переменную в строку\n",
- "- `int()` – конвертирует переменную в `integer`\n",
+ "- `print()` — выводит символы на экран\n",
+ "- `type()` — возвращает тип переменной\n",
+ "- `str()` — конвертирует переменную в строку\n",
+ "- `int()` — конвертирует переменную в `integer`\n",
"\n",
"Примеры использования:"
]
},
{
"cell_type": "code",
- "execution_count": 56,
+ "execution_count": 2,
"id": "0e8faf3d-c37f-483f-8461-01b188d3579e",
"metadata": {},
"outputs": [
@@ -104,17 +106,17 @@
"source": [
"### Функции для списков и строк\n",
"\n",
- "- `sorted`: возвращает уже отсортированный список\n",
- "- `len`: возвращает длину списка\n",
+ "- `sorted`: возвращает отсортированный список\n",
+ "- `len`: возвращает длину списка или строки\n",
"- `max`: возвращает максимальный элемент списка\n",
"- `min`: возвращает минимальный элемент списка \n",
"\n",
- "С помощью `len` мы можем спокойно проходиться по индексам списка:"
+ "С помощью `len` мы можем проходиться по индексам списка:"
]
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 3,
"id": "4fc29c20-e149-4cf9-ad99-8181e05bebd0",
"metadata": {},
"outputs": [
@@ -155,7 +157,7 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 6,
"id": "46c84f50-6c15-43e8-b93a-a08c95a42a54",
"metadata": {},
"outputs": [
@@ -171,7 +173,8 @@
"source": [
"l = [3, 6.4, 10, 1, -20, 30/4, 1/3]\n",
"\n",
- "l_sorted = sorted(l, reverse=False) # False является значением аргумента по умолчанию (дефолтным)\n",
+ "# False является значением аргумента по умолчанию (дефолтным)\n",
+ "l_sorted = sorted(l, reverse=False)\n",
"l_sorted_reverse = sorted(l, reverse=True)\n",
"\n",
"print('Отсортированный список:', l_sorted)\n",
@@ -185,13 +188,13 @@
"source": [
"### Написание функций своими руками\n",
"\n",
- "Синтаксис:\n",
+ "Синтаксис *определения* функции:\n",
"\n",
- "``` python\n",
+ "``` Python\n",
"def название(аргумент1, аргумент2):\n",
- " *код внутри функции*\n",
- " *код внутри функции*\n",
- " *код внутри функции*\n",
+ "\n",
+ " *код внутри функции (тело функции)*\n",
+ "\n",
" return возвращаемое_значение\n",
"```\n",
"\n",
@@ -225,10 +228,10 @@
},
{
"cell_type": "markdown",
- "id": "a68f5bd5",
+ "id": "945fafb6",
"metadata": {},
"source": [
- "> ✨ ☝️ Переменные, которые вы объявлете в функции недоступны вне этой функции. Они называются *локальным*, а переменные объявленные вне функции называются *глобальными*. Постарайтесь не использовать *глобальные* переменные внутри функции: если вам нужно использовать внешнюю переменную, передайте ее как аргумент функции."
+ "> ✨ ☝️ Переменные, которые вы объявлете в функции, недоступны вне этой функции. Они называются *локальным*. Переменные, объявленные вне функции, называются *глобальными*. Постарайтесь не использовать *глобальные* переменные внутри функции: если вам нужно использовать внешнюю переменную, передайте ее как аргумент функции. За состоянием глобальных переменных бывает сложно следить и, как правило, их использование внутри функций приводит к ошибкам."
]
},
{
@@ -238,7 +241,7 @@
"source": [
"### Объекты и методы\n",
"\n",
- "У некоторых типов данных в `python` есть вшитые в них функции. Они называют методами и доступны через точку. Посмотрим на методы строк:"
+ "У некоторых типов данных в `Python` есть вшитые в них полезные функции. Они называются методами и доступны через точку. Посмотрим на методы строк:"
]
},
{
@@ -272,7 +275,7 @@
},
{
"cell_type": "code",
- "execution_count": 24,
+ "execution_count": 7,
"id": "9ac5a697-ac36-44aa-a05a-f878de57d95e",
"metadata": {},
"outputs": [
@@ -286,9 +289,11 @@
}
],
"source": [
- "# сделаем строку с огромным количеством английских символов c и спрячем туда одну кириллическую с\n",
+ "# сделаем строку с огромным количеством английских символов `c` и спрячем\n",
+ "# туда одну кириллическую `с`\n",
"ccc = 'c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c с c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c'\n",
- "index = ccc.find('с') # теперь ищем кириллическую с, получаем ее индекс в строке\n",
+ "# теперь ищем кириллическую с, получаем ее индекс в строке\n",
+ "index = ccc.find('с')\n",
"print(index)\n",
"print(ccc[index])"
]
@@ -299,11 +304,11 @@
"metadata": {},
"source": [
"> ☝ Вместо метода `.find()`, иногда можно использовать ключевое слова `in`. Например, можно сделать следующее:\n",
- "> ```python\n",
+ "> ```Python\n",
"> 'Hello' in 'Hello world!' \n",
"> > True \n",
"> ```\n",
- "> Но не получится найти индекс, только проверить вхождение подстроки в подстроку!"
+ "> Так не получится найти индекс. Этот способ позволяет проверить, содержится ли заданная подстрока в нашей строке."
]
},
{
@@ -311,12 +316,12 @@
"id": "402a1a5c-9194-4b21-80ef-db0b95eb8903",
"metadata": {},
"source": [
- "`.split()` позволяет разделять строки задав разделитель как аргумент. Возвращает этот метод список строк. Например:"
+ "`.split()` позволяет разделять строки, задав разделитель как аргумент. Возвращает этот метод список строк. Например:"
]
},
{
"cell_type": "code",
- "execution_count": 28,
+ "execution_count": 8,
"id": "52427556-4e1d-46cb-bd91-cf508a04e4bd",
"metadata": {},
"outputs": [
@@ -349,7 +354,7 @@
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 9,
"id": "ede4862f-a357-4c27-bce3-17173e78d329",
"metadata": {},
"outputs": [
@@ -360,7 +365,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[0;32mIn[1], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m a \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m10\u001b[39m):\n\u001b[0;32m----> 3\u001b[0m a \u001b[38;5;241m=\u001b[39m a\u001b[38;5;241m.\u001b[39mappend(i)\n",
+ "Cell \u001b[0;32mIn[9], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m a \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m10\u001b[39m):\n\u001b[0;32m----> 3\u001b[0m a \u001b[38;5;241m=\u001b[39m \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mappend\u001b[49m(i)\n",
"\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'append'"
]
}
@@ -428,7 +433,7 @@
"source": [
"### Барбикор\n",
"\n",
- "**(0.75 балла)** С помощью `python` превратите строчку в строчку написанную лесенкой. Например для строки \"Привет, Барби!\" выведите \"ПрИвЕт, БаРбИ!\":"
+ "**(0.75 балла)** С помощью `Python` превратите заданную строку в строку, написанную лесенкой (заглавные и строчные буквы должны чередоваться). Например, для строки \"Привет, Барби!\" выведите \"ПрИвЕт, БаРбИ!\":"
]
},
{
@@ -448,7 +453,7 @@
"id": "28a89595",
"metadata": {},
"source": [
- "**(0.5 балла)** Напишите функцию, которая принимает на вход строку и возвращает ее написанную лЕсЕнКоЙ, например для строки \"Привет, Барби!\" функция должна вернуть \"ПрИвЕт, БаРбИ!\"."
+ "**(0.5 балла)** Напишите функцию, которая принимает на вход строку и возвращает ее написанную лЕсЕнКоЙ. Например, для строки \"Привет, Барби!\" функция должна вернуть \"ПрИвЕт, БаРбИ!\"."
]
},
{
@@ -468,7 +473,7 @@
"source": [
"### Вычисляем размер частиц\n",
"\n",
- "**(1 балл)** Студент геофака пытается обработать данные для своей курсовой работы. Ему дали данные файла эксперимента, но вот незадача – вместо удобной таблички экспериментаторы вписали размер частиц снега в название файла. Оно выглядит так:\n",
+ "**(1 балл)** Студент геофака пытается обработать данные для своей курсовой работы. Ему дали данные файла эксперимента, но вот незадача — вместо удобной таблички экспериментаторы вписали размер частиц снега в название файла. Оно выглядит так:\n",
"`EXPERIM_(две цифры с номером)_(размер частиц)mm.txt`\n",
"\n",
"Сделайте новый список, в котором будут размеры частиц для каждого файла (тип должен быть `int`):"
@@ -476,7 +481,7 @@
},
{
"cell_type": "code",
- "execution_count": 48,
+ "execution_count": null,
"id": "5e8aee82-cf93-4eb8-9d10-7a1b71da017c",
"metadata": {},
"outputs": [],
@@ -510,7 +515,7 @@
"id": "476e4eef-02f6-44f6-82d0-d431e62b3579",
"metadata": {},
"source": [
- "✨ **(1 балл)** А что если создатели были не так заботливы и в номере эксперимента количество символов не было фиксировано? "
+ "✨ **(1 балл)** А что если создатели не были бы так заботливы и в номере эксперимента количество символов не было фиксировано?"
]
},
{
@@ -551,7 +556,7 @@
"source": [
"### Он дивен, палиндром! И ни морд, ни лап не видно… (задача из экзамена)\n",
"\n",
- "**(1 балл)** Проверьте, являются ли палиндромами слова из списка (не учитывайте регистр при проверке). Сделайте новый список в котором будут только палиндромы и выведите его:"
+ "**(1 балл)** Проверьте, являются ли палиндромами слова из списка (не учитывайте регистр при проверке). Сделайте новый список, в котором будут только палиндромы, и выведите его:"
]
},
{
@@ -571,7 +576,7 @@
},
{
"cell_type": "code",
- "execution_count": 23,
+ "execution_count": null,
"id": "62df924b",
"metadata": {},
"outputs": [],
@@ -586,7 +591,7 @@
"id": "2bb59508",
"metadata": {},
"source": [
- "**(0.5 баллов)** Сделайте функцию `palindrom`, которая будет принимать такой список на вход и возвращать на выход список палиндромов"
+ "**(0.5 баллов)** Сделайте функцию `palindrom()`, которая будет принимать такой список на вход и возвращать на выход список палиндромов"
]
},
{
@@ -637,7 +642,7 @@
"id": "73226dc9-e5ea-4866-8cf3-c38157ddfe9b",
"metadata": {},
"source": [
- "**(1.25 балла)** Элементами списка может быть что угодно, даже другой список! В списке ниже каждый список это под-директория (проще говоря папка внутри папки!). Попробуйте найти `.txt` файлы в таком списке:"
+ "**(1.25 балла)** Элементами списка может быть что угодно, даже другой список! В списке ниже каждый список это поддиректория (проще говоря папка внутри папки!). Попробуйте найти `.txt` файлы в таком списке:"
]
},
{
@@ -662,7 +667,7 @@
"source": [
"### Спотифай (задача из экзамена)\n",
"\n",
- "**(1.5 балла)** Дана строка в которой приведены разные треки разных исполнителей. Название исполнителя и трека разделено символом `|`, а разные треки разделены с помощью `,`. В строке есть как минимум один трек. Во второй строке вводится поисковой запрос. Выведите в качестве ответа количество треков, где поисковый запрос встречается или в названии трека или в имени исполнителя. Ищите вне зависимости от регистра, то есть: `tHiS` и `this` должны считаться одним словом."
+ "**(1.5 балла)** Дана строка, в которой приведены разные треки разных исполнителей. Название исполнителя и трека разделено символом `|`, а разные треки разделены с помощью `,`. В строке есть как минимум один трек. Во второй строке вводится поисковой запрос. Выведите в качестве ответа количество треков, где поисковый запрос встречается или в названии трека или в имени исполнителя. Ищите вне зависимости от регистра, то есть: `tHiS` и `this` должны считаться одним словом."
]
},
{
@@ -698,11 +703,11 @@
"id": "bbba430e",
"metadata": {},
"source": [
- "✨ **(1.5 балла)** Выведите исполнителей и треки в которых встречается нужный нам поисковой запрос. Сначала выведите исполнителей в виде:\n",
+ "✨ **(1.5 балла)** Выведите исполнителей и треки, в которых встречается нужный нам поисковой запрос. Сначала выведите исполнителей в виде:\n",
"\n",
- "`Исполнители в которых встречается *search*: *список исполнителей через запятую*`\n",
+ "`Исполнители, в которых встречается *search*: *список исполнителей через запятую*`\n",
"\n",
- "`Треки в которых встречается *search*: *список треков через запятую*`"
+ "`Треки, в которых встречается *search*: *список треков через запятую*`"
]
},
{
@@ -722,7 +727,7 @@
"source": [
"### ✨ Пошёл на фиг со своей физической географией\n",
"\n",
- "**(1.5 балла)** Климат любой планеты во многом определяется зависимостью [температуры от высоты](https://ru.wikipedia.org/wiki/%D0%90%D1%82%D0%BC%D0%BE%D1%81%D1%84%D0%B5%D1%80%D0%B0_%D0%97%D0%B5%D0%BC%D0%BB%D0%B8). Один из показателей, который влияет на циркуляцию атмосферы это температурный градиент. Не углублясь в теорию, если температура падает с высотой быстрее опредленного значения, то она становится турбулентной, а если медленнее – то наоборот, все турбулентности подавляются. Это значение называется *[адиабатическим градиентом](https://ru.wikipedia.org/wiki/%D0%90%D0%B4%D0%B8%D0%B0%D0%B1%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82_%D1%82%D0%B5%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D1%83%D1%80%D1%8B)* и равно для Земли 9.8°. Посчитайте градиент температуры для вот этого температурного профиля и запишите его в новый список.\n",
+ "**(1.5 балла)** Климат любой планеты во многом определяется зависимостью [температуры от высоты](https://ru.wikipedia.org/wiki/%D0%90%D1%82%D0%BC%D0%BE%D1%81%D1%84%D0%B5%D1%80%D0%B0_%D0%97%D0%B5%D0%BC%D0%BB%D0%B8). Один из показателей, который влияет на циркуляцию атмосферы, — температурный градиент. Не углублясь в теорию, если температура падает с высотой быстрее опредленного значения, то она становится турбулентной, а если медленнее — то наоборот, все турбулентности подавляются. Это значение называется *[адиабатическим градиентом](https://ru.wikipedia.org/wiki/%D0%90%D0%B4%D0%B8%D0%B0%D0%B1%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82_%D1%82%D0%B5%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D1%83%D1%80%D1%8B)* и равно для Земли 9.8°. Посчитайте градиент температуры для заданного температурного профиля и запишите его в новый список.\n",
"\n",
"Формула температурного градиента выглядит так:\n",
"$$\n",
@@ -754,7 +759,7 @@
"\n",
" Подсказка как это написать:
\n",
"\n",
- "``` python\n",
+ "``` Python\n",
"(temp[i+1]-temp[i])/(height[i+1] - height[i])\n",
"```\n",
" \n",
@@ -763,7 +768,7 @@
},
{
"cell_type": "code",
- "execution_count": 51,
+ "execution_count": null,
"id": "21d5695c-6ab4-4328-95ac-acb41e168e50",
"metadata": {},
"outputs": [],
@@ -791,6 +796,26 @@
"source": [
"# Ваш код "
]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2d19786a",
+ "metadata": {},
+ "source": [
+ "### Олбанец-попаданец\n",
+ "\n",
+ "Задолго до вашего рождения в нижнем рунете был распространен [олбанский язык](https://ru.wikipedia.org/wiki/%D0%96%D0%B0%D1%80%D0%B3%D0%BE%D0%BD_%D0%BF%D0%B0%D0%B4%D0%BE%D0%BD%D0%BA%D0%BE%D0%B2). Вы оказались в прошлом и решили попробовать себя в роли полевого лингвиста. У вас в распоряжении оказался список самых выдающихся слов из лексикона олбанцев. Создайте новый список, в котором эти слова будут отсортированы в алфавитном порядке. Создайте другой список, в котором будет реализована обратная сортировка."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "20c077e6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "top_alban_words = ['аффтар', 'курса', 'убейся', 'апстену']"
+ ]
}
],
"metadata": {
@@ -809,7 +834,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.5"
+ "version": "3.8.16"
}
},
"nbformat": 4,
From 8e7eedcb1b7f3cffe207b461cba2e736980c990c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mi=D1=81hael=20Belvedersky?=
Date: Tue, 24 Sep 2024 11:09:48 +0300
Subject: [PATCH 4/4] fix: most important language errors
---
Lectures/Lecture4/Lecture4.ipynb | 122 ++++++++++++++-----------------
1 file changed, 53 insertions(+), 69 deletions(-)
diff --git a/Lectures/Lecture4/Lecture4.ipynb b/Lectures/Lecture4/Lecture4.ipynb
index 6fd767d0..7923d608 100644
--- a/Lectures/Lecture4/Lecture4.ipynb
+++ b/Lectures/Lecture4/Lecture4.ipynb
@@ -33,7 +33,7 @@
"y = 4\\frac{(-1)^n}{2n+1}\n",
"$$\n",
"\n",
- "Сложите все `y` для `n` равных от нуля* до `10000`. Что за число получилось? "
+ "Сложите все `y` для `n`, равных от нуля* до `10000`. Что за число получилось? "
]
},
{
@@ -87,7 +87,7 @@
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": 1,
"id": "909b9f4a",
"metadata": {},
"outputs": [
@@ -125,7 +125,7 @@
"source": [
"\n",
"\n",
- " Проверяем является одно число делителем другого
\n",
+ " Проверяем, является ли одно число делителем другого
\n",
"\n",
"\n",
"``` python\n",
@@ -144,7 +144,7 @@
"\n",
"\n",
"\n",
- " Пишем цикл от единицы (?) до числа (?) и проверяем находим все делители этого числа
\n",
+ " Пишем цикл от единицы (?) до числа (?) и находим все делители этого числа
\n",
"\n",
"\n",
"``` python\n",
@@ -233,20 +233,20 @@
"source": [
"## **Более крутой способ форматировать строки**\n",
"\n",
- "Вам не казалось что складывание строк через:\n",
+ "Вам не казалось, что складывание строк через\n",
"``` python\n",
"'Сегодня ' + str(degrees) + ' градусов по Цельсию' \n",
"```\n",
- "немного громоздким? Это правда, и можно делать это более элегантно сразу тремя разными способами.\n",
+ "выглядит немного громоздким? Это правда, и можно форматировать строки более элегантно сразу тремя разными способами.\n",
"\n",
"### `f`-строки\n",
"\n",
- "Добавив к строке до её начала `f` можно вставлять туда числовые значения:"
+ "Если добавить к строке до её начала `f`, то в неё можно вставлять числовые значения:"
]
},
{
"cell_type": "code",
- "execution_count": 87,
+ "execution_count": 3,
"id": "8f4d5e51-bf5a-4966-8eae-b73c555cb93f",
"metadata": {},
"outputs": [
@@ -254,13 +254,13 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Сегодня в Москве 24.2 градуса по Цельсию 1\n"
+ "Сегодня в Москве 24.2 градуса по Цельсию\n"
]
}
],
"source": [
"degrees = 24.2\n",
- "message = f'Сегодня в Москве {degrees} градуса по Цельсию {}' \n",
+ "message = f'Сегодня в Москве {degrees} градуса по Цельсию'\n",
"\n",
"print(message)"
]
@@ -274,7 +274,7 @@
"\n",
" ☝ ✨ f-строки можно использовать для нахождения багов
\n",
"\n",
- "Можно выводить сразу с выражением `=` в процессе, и наиболее всего такая форма удобна для нахождения багов в коде, так как позволяет подсвечивать сразу названия переменных:\n",
+ "Можно выводить строку сразу с выражением `=` в процессе, и наиболее всего такая форма удобна для нахождения багов в коде, так как позволяет подсвечивать сразу названия переменных:\n",
"\n",
"``` python\n",
"name = 'SCP-173'\n",
@@ -320,7 +320,7 @@
"id": "f8a1b33c-c073-4511-92a3-b7829351cb0f",
"metadata": {},
"source": [
- "Большой разницы в этих способах нету, можно спокойно использовать и то и то."
+ "Большой разницы в этих способах нету, можно спокойно использовать оба."
]
},
{
@@ -335,7 +335,7 @@
},
{
"cell_type": "code",
- "execution_count": 64,
+ "execution_count": 4,
"id": "7d65c038-d276-4cf8-8165-9ebc845ca0cf",
"metadata": {},
"outputs": [
@@ -358,7 +358,7 @@
"id": "36348142-c321-4f4a-bcad-f44c42e06ae8",
"metadata": {},
"source": [
- "Но сейчас его почти не используют, чтобы не путать с оператором остатка от деления, да `f`-строки просто более читаемые."
+ "Но сейчас его почти не используют, чтобы не путать с оператором остатка от деления, да и `f`-строки просто более читаемые."
]
},
{
@@ -385,14 +385,14 @@
"source": [
"# **Работа с файлами в python**\n",
"\n",
- "До этого мы хранили всю информацию в строчках кода. В реальности, все данные всегда хранятся в файлах! Давайте разберем как их считывать и что с ним делать.\n",
+ "До этого мы хранили всю информацию в строчках кода. В реальности все данные всегда хранятся в файлах! Давайте разберем, как их считывать и что с ним делать.\n",
"\n",
"Простейший способ открытия текстового файла выглядит так: "
]
},
{
"cell_type": "code",
- "execution_count": 67,
+ "execution_count": 5,
"id": "37e1cdcc-3a31-41f5-9de4-eb39f3af8ff4",
"metadata": {},
"outputs": [
@@ -414,8 +414,7 @@
"Krasnoyarsk 56.0089 92.8719\n",
"Voronezh 51.6717 39.2106\n",
"Perm 58.0139 56.2489\n",
- "Volgograd 48.7086 44.5147\n",
- "\n"
+ "Volgograd 48.7086 44.5147\n"
]
}
],
@@ -432,12 +431,12 @@
"id": "f2c7d6a0-9c01-4ce9-a57d-7042191742ae",
"metadata": {},
"source": [
- "Каждый раз открывая файл мы создаем специальную переменную *файлового потока*. После использования файла, эту переменную нужно закрыть, иначе могут возникнуть [разные неприятные последствия](https://stackoverflow.com/questions/25070854/why-should-i-close-files-in-python). Часть люди забывают закрывать файл, да и выглядит это не очень читаемо, поэтому была придумана следующая схема:"
+ "Каждый раз, открывая файл, мы создаем специальную переменную *файлового потока*. После использования файла, эту переменную нужно закрыть, иначе могут возникнуть [разные неприятные последствия](https://stackoverflow.com/questions/25070854/why-should-i-close-files-in-python). Часть люди забывают закрывать файл, да и выглядит это не очень читаемо, поэтому была придумана следующая схема:"
]
},
{
"cell_type": "code",
- "execution_count": 69,
+ "execution_count": 6,
"id": "3b582e95-644c-45e3-a0d2-86a157ea90fe",
"metadata": {},
"outputs": [
@@ -459,8 +458,7 @@
"Krasnoyarsk 56.0089 92.8719\n",
"Voronezh 51.6717 39.2106\n",
"Perm 58.0139 56.2489\n",
- "Volgograd 48.7086 44.5147\n",
- "\n"
+ "Volgograd 48.7086 44.5147\n"
]
}
],
@@ -476,7 +474,7 @@
"id": "ffee1319-eefb-45b9-bbc0-af9d32ff924b",
"metadata": {},
"source": [
- "Она закрывает файл сразу же окончания отступа.\n",
+ "Она закрывает файл сразу же после окончания отступа.\n",
"\n",
"> ☝ Строго говоря, ключевое слово `with` используется и для [других целей](https://stackoverflow.com/questions/3012488/what-is-the-python-with-statement-designed-for), но в абсолютном большинстве случаев его используют именно для открытия/закрытия файлов."
]
@@ -489,12 +487,12 @@
"Теперь посмотрим на разные методы для считывания файлов:\n",
"- `.read()` считывает файл полностью в виде строки\n",
"- `.readline()` считывает только одну строку и сохраняет положение курсора: если вызвать еще раз, то считает уже следующую строку\n",
- "- `.readlines()` считывает все строки и записывает в массив: каждый элемент массива это новая строка "
+ "- `.readlines()` считывает все строки и записывает в массив: каждый элемент массива — это новая строка "
]
},
{
"cell_type": "code",
- "execution_count": 70,
+ "execution_count": 7,
"id": "e9c87f31-af54-4e6b-a18d-ffc4c176199d",
"metadata": {},
"outputs": [
@@ -502,7 +500,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "['Moscow 55.7558 37.6178\\n', 'SaintPetersburg 59.9500 30.3167\\n', 'Novosibirsk 55.0333 82.9167\\n', 'Yekaterinburg 56.8356 60.6128\\n', 'NizhniyNovgorod 56.3269 44.0075\\n', 'Kazan 55.7964 49.1089\\n', 'Chelyabinsk 55.1500 61.4000\\n', 'Omsk 54.9667 73.3833\\n', 'Samara 53.2028 50.1408\\n', 'Rostov 47.2333 39.7000\\n', 'Ufa 54.7261 55.9475\\n', 'Krasnoyarsk 56.0089 92.8719\\n', 'Voronezh 51.6717 39.2106\\n', 'Perm 58.0139 56.2489\\n', 'Volgograd 48.7086 44.5147\\n']\n"
+ "['Moscow 55.7558 37.6178\\n', 'SaintPetersburg 59.9500 30.3167\\n', 'Novosibirsk 55.0333 82.9167\\n', 'Yekaterinburg 56.8356 60.6128\\n', 'NizhniyNovgorod 56.3269 44.0075\\n', 'Kazan 55.7964 49.1089\\n', 'Chelyabinsk 55.1500 61.4000\\n', 'Omsk 54.9667 73.3833\\n', 'Samara 53.2028 50.1408\\n', 'Rostov 47.2333 39.7000\\n', 'Ufa 54.7261 55.9475\\n', 'Krasnoyarsk 56.0089 92.8719\\n', 'Voronezh 51.6717 39.2106\\n', 'Perm 58.0139 56.2489\\n', 'Volgograd 48.7086 44.5147']\n"
]
}
],
@@ -518,14 +516,14 @@
"id": "71d80b27-b0f7-4500-93d1-a5a45a99ff6c",
"metadata": {},
"source": [
- "> ☝ Символ `\\n` обозначает начало новой строки, а сам механизм разделения строк может работать немного по разному на разных системах\n",
+ "> ☝ Символ `\\n` обозначает начало новой строки, а сам механизм разделения строк может работать немного по-разному на разных системах\n",
"\n",
"При желании, мы можем сделать (почти) то же самое с помощью:"
]
},
{
"cell_type": "code",
- "execution_count": 83,
+ "execution_count": 8,
"id": "a986bc32-650d-4c64-bfb3-295d461d706b",
"metadata": {},
"outputs": [
@@ -557,7 +555,7 @@
},
{
"cell_type": "code",
- "execution_count": 82,
+ "execution_count": 9,
"id": "4e02a541-4d04-4227-9329-f396df914b15",
"metadata": {},
"outputs": [
@@ -565,20 +563,20 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Moscow 55.7558 37.6178\r\n",
- "SaintPetersburg 59.9500 30.3167\r\n",
- "Novosibirsk 55.0333 82.9167\r\n",
- "Yekaterinburg 56.8356 60.6128\r\n",
- "NizhniyNovgorod 56.3269 44.0075\r\n",
- "Kazan 55.7964 49.1089\r\n",
- "Chelyabinsk 55.1500 61.4000\r\n",
- "Omsk 54.9667 73.3833\r\n",
- "Samara 53.2028 50.1408\r\n",
- "Rostov 47.2333 39.7000\r\n",
- "Ufa 54.7261 55.9475\r\n",
- "Krasnoyarsk 56.0089 92.8719\r\n",
- "Voronezh 51.6717 39.2106\r\n",
- "Perm 58.0139 56.2489\r\n",
+ "Moscow 55.7558 37.6178\n",
+ "SaintPetersburg 59.9500 30.3167\n",
+ "Novosibirsk 55.0333 82.9167\n",
+ "Yekaterinburg 56.8356 60.6128\n",
+ "NizhniyNovgorod 56.3269 44.0075\n",
+ "Kazan 55.7964 49.1089\n",
+ "Chelyabinsk 55.1500 61.4000\n",
+ "Omsk 54.9667 73.3833\n",
+ "Samara 53.2028 50.1408\n",
+ "Rostov 47.2333 39.7000\n",
+ "Ufa 54.7261 55.9475\n",
+ "Krasnoyarsk 56.0089 92.8719\n",
+ "Voronezh 51.6717 39.2106\n",
+ "Perm 58.0139 56.2489\n",
"Volgograd 48.7086 44.5147"
]
}
@@ -625,12 +623,12 @@
"source": [
"### Функция `input()`\n",
"\n",
- "Функция `input()` позволяет считать данные прямо с клавиатуры и записать их в переменную. Выполните следующую ячейку чтобы попробовать:"
+ "Функция `input()` позволяет считать данные прямо с клавиатуры и записать их в переменную. Выполните следующую ячейку, чтобы попробовать:"
]
},
{
"cell_type": "code",
- "execution_count": 123,
+ "execution_count": 11,
"id": "da1588a2",
"metadata": {
"scrolled": false
@@ -640,8 +638,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "бла бла бла\n",
- "Мы ввели бла бла бла\n"
+ "Мы ввели тест\n"
]
}
],
@@ -667,14 +664,14 @@
"\n",
"### Котик ватру4шка 12вареник?\n",
"\n",
- "- Считываются строки через пробел до тех пор пока не введен `0`\n",
+ "- Считываются строки через пробел до тех пор, пока не введен `0`\n",
"- Для каждой вводимой строки сделать проверку: если она состоит только из букв и ее длина менее 7 символов, то ее нужно добавить в список\n",
"- Напечатать получишийся список"
]
},
{
"cell_type": "code",
- "execution_count": 113,
+ "execution_count": 14,
"id": "23778afb",
"metadata": {},
"outputs": [
@@ -682,7 +679,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[]\n"
+ "['котик', 'лук', 'вода', 'лупа']\n"
]
}
],
@@ -702,7 +699,7 @@
},
{
"cell_type": "code",
- "execution_count": 117,
+ "execution_count": 15,
"id": "4cbd5189",
"metadata": {},
"outputs": [
@@ -710,12 +707,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "котик\n",
- "луковка\n",
- "луковка1\n",
- "12вареник\n",
- "0\n",
- "['котик']\n"
+ "[]\n"
]
}
],
@@ -745,23 +737,15 @@
"source": [
"- На первой строке вводится слово\n",
"- Затем вводится последовательность букв\n",
- "- Программа должна проверить, что слово начинается с введенной последовательности и ее длина больше 5 символов, то напечтать \"подходит\""
+ "- Если слово начинается с введенной последовательности и его длина больше 5 символов, то печатается строка \"подходит\""
]
},
{
"cell_type": "code",
- "execution_count": 122,
+ "execution_count": 16,
"id": "98773608",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Подходит\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"input1 = 'лисичка'\n",
"input2 = 'ли1'\n",
@@ -788,7 +772,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.5"
+ "version": "3.11.3"
}
},
"nbformat": 4,