From 916df757f21b1e294564264a7c70823429c71c9b Mon Sep 17 00:00:00 2001 From: Egor Vavilov Date: Wed, 6 Dec 2023 15:00:24 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=20"=D0=A1?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B2?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B0=D0=BC=D0=B8"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- questions.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/questions.md b/questions.md index 4a4fe2e..4d6f2f9 100644 --- a/questions.md +++ b/questions.md @@ -4852,6 +4852,37 @@ print(binary_search(my_list, 3)) # => 1 print(binary_search(my_list, -1)) # => None ``` +## Сортировка вставками + +Последовательно перебираются все элементы оригинального списка и вставляются в результирующий отсортированный список на правильную позицию. +Для того, чтобы произвести эту вставку, необходимо перебрать все элементы отсортированного списка и сравнить их с элементом оригинального списка. + +```python +def sort_insert(original_list: list) -> list: + if len(original_list) < 2: + return original_list + + result_list = [original_list[0]] + + for original_item in original_list[1:]: + location = 0 + while location < len(result_list): + if result_list[location] >= original_item: + result_list.insert(location, original_item) + break + location += 1 + else: + result_list.append(original_item) + + return result_list + + +assert sort_insert([3, 5, 4, 2, 1]) == [1, 2, 3, 4, 5] +assert sort_insert([1, 2, 3]) == [1, 2, 3] +assert sort_insert([3, 3, 5, 4, 5, 4, 1, 2, 2, 1]) == [1, 1, 2, 2, 3, 3, 4, 4, 5, 5] +assert sort_insert([]) == [] +``` + ## Рекурсивные алгоритмы Должны иметь базовый и рекурсивный случай. Если рекурсивный алгоритм не будет иметь базового случая, он будет выполняться вечно, так как не будет условия при котором нужно вернуть управление. From 7a5f1f6e122240b8b34eeb79e8c7e30832f3c4c0 Mon Sep 17 00:00:00 2001 From: Shecspi Date: Wed, 6 Dec 2023 15:04:35 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D1=83=20=D0=B2=D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B0=D0=BC=D0=B8?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 267aed7..85db15b 100644 --- a/README.md +++ b/README.md @@ -284,6 +284,7 @@ * [О-большое при оценке сложности](questions.md/#О-большое-при-оценке-сложности) * [Простой поиск](questions.md/#Простой-поиск) * [Бинарный поиск](questions.md/#Бинарный-поиск) + * [Сортировка вставками](questions.md/#сортировка-вставками) * [Рекурсивные алгоритмы](questions.md/#Рекурсивные-алгоритмы) * [Быстрая сортировка](questions.md/#Быстрая-сортировка) * [Граф](questions.md/#Граф) From 618e70429c03e524c9bf44737bab06bb175f6ef4 Mon Sep 17 00:00:00 2001 From: Shecspi Date: Sun, 10 Dec 2023 15:46:58 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D1=8B=20=D0=B0?= =?UTF-8?q?=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=20=D0=B2=20asyncio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + questions.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/README.md b/README.md index 85db15b..24325d7 100644 --- a/README.md +++ b/README.md @@ -181,6 +181,7 @@ * [GIL, потоки, процессы](questions.md/#GIL-потоки-процессы) + [Что такое GIL. Какие у него есть проблемы](questions.md/#Что-такое-GIL-Какие-у-него-есть-проблемы) + [Работали ли Вы с asyncio. В чём его особенность](questions.md/#Работали-ли-Вы-с-asyncio-В-чём-его-особенность) + + [Какие способы запуска асинхронного кода есть в asyncio](questions.md/#Какие-способы-запуска-асинхронного-кода-есть-в-asyncio) + [Что такое async/await, для чего они нужны и как их использовать](questions.md/#Что-такое-asyncawait-для-чего-они-нужны-и-как-их-использовать) + [Как в питоне реализуется многопоточность. Какими модулями](questions.md/#Как-в-питоне-реализуется-многопоточность-Какими-модулями) + [В чем отличие тредов от мультипроцессинга](questions.md/#В-чем-отличие-тредов-от-мультипроцессинга) diff --git a/questions.md b/questions.md index 4d6f2f9..e71fe52 100644 --- a/questions.md +++ b/questions.md @@ -489,8 +489,62 @@ class Iterator(Iterable): `__iter__` Возвращает `self`. Это позволяет использовать итератор там, где ожидается итерируемых объект, например `for`. `__subclasshook__` Проверяет наличие у класса метода `__iter__` и `__next__` +### Пример итерируемого объекта + +Классическая реализация итерируемого объекта: +```python +class Sentence: + def __init__(self, text): + self.words = text.split() + + def __iter__(self): + """ + Метод __iter()__ выполняет требования итерируемого объекта - + создаёт и возвращает иторатор. + При каждом вызове встроенной функции iter() создаётся новый объект итератора. + Лучше не совмещать в одном классе итератор и итерируемый объект, + чтобы можно было поддерживать несколько активных проходов + одного и того же итерируемого объекта. + """ + return SentenceIterator(self.words) + + +class SentenceIterator: + def __init__(self, words) -> None: + self.words = words + self.index = 0 + + def __next__(self): + """ + Возвращает следующее слово или возбуждает StopIteration, + если последовательность закончилась. + """ + try: + word = self.words[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return word + + def __iter__(self): + return self +``` + +Итерируемый объект с генераторной функцией: +```python +class Sentence: + def __init__(self, text): + self.text = text + self.words = text.split() + + def __iter__(self): + for word in self.words: + yield word +``` ### Что такое генератор +**Генератор** - это итератор, вычисляющий значения на ходу, тем самым экономя оперативную память. Для создания генератора не используется метод `__next__()`, вместо этого используется ключевое слова `yield`, в результате чего получается генераторная функция. + В зависимости от контекста, может означать либо функцию-генератор, либо итератор генератора (чаще всего, последнее). Методы `__iter__` и `__next__` у генераторов создаются автоматически. @@ -508,6 +562,20 @@ class Iterator(Iterable): `yield` замораживает состояние функции-генератора и возвращает текущее значение. После следующего вызова `__next__()` функция-генератор продолжает своё выполнение с того места, где она была приостановлена. +### Пример генератора: + +Функция `fibonachi` является генераторной, так как при каждой итерации возвращает одно значение. Она не хранит весь список чисел Фибоначи в памяти, он бесконечный и не поместился бы в оперативную память. +```python +def fibonachi(): + a, b = 0, 1 + while True: + yield a + # Значение `a` отдаётся и функция приостанавливает своё выполнение. + # Код ниже и следующая итерация цикла произойдут только + # при следующем вызове next(). + a, b = b, b + a +``` + ### В чем отличие \[x for x in y\] от (x for x in y) Первое выражение возвращает список (списковое включение), второе – генератор. @@ -1422,6 +1490,16 @@ greet('Ivan') AsyncIO подойдет, если приложение большую часть времени тратит на чтение/запись данных, а не их обработку. Например, у вас много медленных запросов — вебсокеты, long polling или есть медленные внешние синхронные бекенды, запросы к которым неизвестно когда завершатся. +### Какие способы запуска асинхронного кода есть в asyncio + +| Сфера применения | asyncio.create_task и await | asyncio.gather | asyncio.TaskGroup | asyncio.as_completed | asyncio.wait | +| ----- | ----- | ----- | ----- | ----- | +| Нужно дождаться выполнения всех задач вне зависимости от исключений в них | + | + | - | + | + | + | Надо получать результаты в порядке их появления | - | - | - | + | + | + | Надо получать результаты в заранее заданном порядке | + | + | + | - | - | +| Надо выполнить одну задачу из набора, остальные отменить | - | - | - | - | + | +| Надо выполнить задачи до падения какой-то задачи с исключением | - | - | + | - | + | +| Надо задать таймаут на выполнение задач | - | - | - | + | + | ### Что такое async/await, для чего они нужны и как их использовать Ключевое слово `async` идет до `def`, чтобы показать, что метод является асинхронным. Ключевое слово `await` показывает, что вы ожидаете завершения сопрограммы. From e3462867bed920cf009ce4c84d2061391b77a064 Mon Sep 17 00:00:00 2001 From: Shecspi Date: Sun, 10 Dec 2023 15:49:04 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D1=8B=20=D0=B0?= =?UTF-8?q?=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=20=D0=B2=20asyncio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- questions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/questions.md b/questions.md index e71fe52..be0628b 100644 --- a/questions.md +++ b/questions.md @@ -1493,7 +1493,7 @@ AsyncIO подойдет, если приложение большую част ### Какие способы запуска асинхронного кода есть в asyncio | Сфера применения | asyncio.create_task и await | asyncio.gather | asyncio.TaskGroup | asyncio.as_completed | asyncio.wait | -| ----- | ----- | ----- | ----- | ----- | +| ----- | ----- | ----- | ----- | ----- | ----- | | Нужно дождаться выполнения всех задач вне зависимости от исключений в них | + | + | - | + | + | | Надо получать результаты в порядке их появления | - | - | - | + | + | | Надо получать результаты в заранее заданном порядке | + | + | + | - | - |