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": [
+ " ☝ ✨✨ Заметка про добавление новых элементов в списки
\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",
" ☝ ✨ Сеты в 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",
" \n",
" Проверяем является одно число делителем другого
\n",
+ " Проверяем, является ли одно число делителем другого
\n",
"\n",
"\n",
"``` python\n",
@@ -144,7 +144,7 @@
"\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 @@
" ☝ ✨ 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,
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",
- "``` python\n",
+ "``` Python\n",
"(temp[i+1]-temp[i])/(height[i+1] - height[i])\n",
"```\n",
"