diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index fd693ee..b43a5fa 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -6,7 +6,7 @@ jobs: check-toc: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Run run: make toc-check @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Get TAG if: startsWith(github.ref, 'refs/tags/') run: echo "TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV diff --git a/README.md b/README.md index 267aed7..64d45b9 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ + [В каких случаях можно обработать SyntaxError](questions.md/#В-каких-случаях-можно-обработать-SyntaxError) + [Можно ли создавать собственные исключения](questions.md/#Можно-ли-создавать-собственные-исключения) + [Для чего нужны предупреждения (warnings) и как создать собственное](questions.md/#Для-чего-нужны-предупреждения-warnings-и-как-создать-собственное) - + [Для чего нужен модуль warning](questions.md/#Для-чего-нужен-модуль-warning) + + [Для чего нужен модуль warnings](questions.md/#Для-чего-нужен-модуль-warnings) * [Декораторы](questions.md/#Декораторы) + [Что такое декораторы. Зачем нужны](questions.md/#Что-такое-декораторы-Зачем-нужны) + [Что может быть декоратором. К чему может быть применен декоратор](questions.md/#Что-может-быть-декоратором-К-чему-может-быть-применен-декоратор) diff --git a/questions.md b/questions.md index 6c471d8..7eddbfc 100644 --- a/questions.md +++ b/questions.md @@ -12,14 +12,18 @@ ### Какие операции поддерживают большинство последовательностей - `x in s`, `x not in s` – находится ли элемент x в последовательности s (для строк и последовательностей байтов – является ли x подстрокой s) -- `s + t` – конкатенация последовательностей +- `s + t` – конкатенация последовательностей s и t - `s * n, n * s` – конкатенация n нерекурсивных копий последовательности s - `s[i]` – i-й элемент последовательности s -- `s[i:j]` – срез последовательности s от i до j -- `s[i:j:k]` – срез последовательности s от i до j с шагом k -- `len(s)` – длина последовательности -- `min(s)` – минимальный элемент последовательности -- `max(s)` – максимальный элемент последовательности +- `s[:i]` - срез всех элементов последовательности s до i (не включая i) +- `s[i:]` - срез всех элементов последовательности s от i до последнего элемента +- `s[-i:]` - срез последних i элементов последовательности s +- `s[::-1]` - перевернуть последовательность +- `s[i:j]` – срез последовательности s от i до j (не включая j) +- `s[i:j:k]` – срез последовательности s от i до j с шагом k (не включая j) +- `len(s)` – длина последовательности s +- `min(s)` – минимальный элемент последовательности s +- `max(s)` – максимальный элемент последовательности s - `s.index(x[, i[, j]])` – индекс первого вхождения x (опционально – начиная с позиции i и до позиции j) - `s.count(x)` – общее количество вхождений x в s - `sum(s)` – сумма элементов последовательности @@ -68,7 +72,43 @@ На уровне языка отличаются тем, что в кортеж нельзя добавить или убрать элемент. На уровне интерпретатора различий нет. Обе коллекции представлены массивом указателей на структуру `PyObject`. -Для списка определены функции, которые добавляют в такой массив новый элемент, удаляют имеющийся, соединяют два массива в один. Они вызываются методами списка `.append()`, `.pop()`, `.sort()` и т.д. +Существуют специальные функции для работы со списками. Они вызываются методами списка. Ниже приведены наиболее часто используемые. + +```python +# Создаем исходный список +lst = [1, 2, 3] + +# append(x): добавляет элемент в конец списка +lst.append(4) +# Теперь lst = [1, 2, 3, 4] + +# extend(iterable): расширяет список, добавляя элементы из итерируемого объекта +lst.extend([5, 6]) +# Теперь lst = [1, 2, 3, 4, 5, 6] + +# insert(i, x): вставляет элемент x на позицию i +lst.insert(0, 'start') +# Теперь lst = ['start', 1, 2, 3, 4, 5, 6] + +# remove(x): удаляет первое вхождение элемента x +lst.remove(3) +# Теперь lst = ['start', 1, 2, 4, 5, 6] + +# pop([i]): удаляет и возвращает элемент на позиции i (по умолчанию последний) +last = lst.pop() +# last = 6, а lst = ['start', 1, 2, 4, 5] + +# sort(): сортирует список на месте +lst = [3, 1, 4, 1, 5, 9, 2] +lst.sort() +# Теперь lst = [1, 1, 2, 3, 4, 5, 9] + +# reverse(): разворачивает список на месте +lst.reverse() +# Теперь lst = [9, 5, 4, 3, 2, 1, 1] +``` + + ### Что такое диапазон @@ -380,7 +420,7 @@ foo() Интерпретатор создаёт объект «john» и «имя» var, а затем связывает объект с данным именем. При вызове функции, новых объектов не создаётся, вместо этого в её области видимости создаётся имя, которое связывается с существующим объектом. -Но в python есть изменяемые и неизменяемые типы. К первым, например, относятся числа: при арифметических операциях существующие объекты не меняются, а создаётся новый объект, с которым потом связывается существующее имя. Если же со старым объектом после этого не связано ни одного имени, оно будет удалено с помощью механизма подсчёта ссылок. +Но в python есть изменяемые и неизменяемые типы. Ко вторым, например, относятся числа: при арифметических операциях существующие объекты не меняются, а создаётся новый объект, с которым потом связывается существующее имя. Если же со старым объектом после этого не связано ни одного имени, оно будет удалено с помощью механизма подсчёта ссылок. Если же имя связано с переменной изменяемого типа, то при операциях с ней изменяется память объекта, соответственно все имена, связанные с данной областью памяти «увидят» изменения. ### Что такое замыкание @@ -925,9 +965,9 @@ except ZeroDivisionError: Базовым классом для предупреждений является Warning, который наследуется от Exception. Базовым классом-наследником Warning для пользовательских предупреждений является UserWarning. -### Для чего нужен модуль warning +### Для чего нужен модуль warnings -В модуле warning собраны функции для работы с предупреждениями. +В модуле warnings собраны функции для работы с предупреждениями. Основной является функция warn, которая принимает один обязательный параметр message, который может быть либо строкой-сообщением, либо экземпляром класса или подкласса Warning (в таком случае параметр category устанавливается автоматически) и два опциональных параметра: category (по умолчанию – UserWarning) – класс предупреждения и stacklevel (по умолчанию – 1) – уровень вложенности функций, начиная с которого необходимо выводить содержимое стека вызовов (полезно, например, для функций-обёрток для вывода предупреждений, где следует задать stacklevel=2, чтобы предупреждение относилось к месту вызова данной функции, а не самой функции). ## Декораторы @@ -1433,16 +1473,17 @@ import aiohttp urls = ['http://www.google.com/', 'http://www.yandex.ru/', 'http://www.python.org/'] async def call_https://github.com/url(url): - print('Starting {}'.format(url)) - response = await aiohttp.get(url) - data = await response.text() - print('{}: {} bytes: {}'.format(url, len(data), data)) - return data + async with aiohttp.ClientSession() as session: + print('Starting {}'.format(url)) + async with session.get(url) as response: + data = await response.text() + print('{}: {} bytes: {}'.format(url, len(data), data)) + return data futures = [call_https://github.com/url(url) for url in urls] loop = asyncio.get_event_loop() -loop.run_until_complete(asyncio.wait(futures)) +loop.run_until_complete(asyncio.gather(*futures)) ``` Программа состоит из метода async. Во время выполнения он возвращает сопрограмму, которая затем находится в ожидании. @@ -1637,6 +1678,7 @@ class MyClass(BaseClass, metaclass=Singleton): ## Что такое garbage collector. В чём его плюсы и минусы - [Всё, что нужно знать о сборщике мусора в Python](https://habr.com/ru/post/417215/) +- [CPython Garbage Collection: The Internal Mechanics and Algorithms](https://blog.codingconfessions.com/p/cpython-garbage-collection-internals) GC (generational garbage collector) - это сборщик мусора, создавался он в первую очередь для обнаружения и удаления циклических ссылок. `gc` является встроенным в python модулем и при необходимости его можно выключить и запускать вручную (или не запускать). Чтобы понимать для чего был создан GC нужно понимать как в Python работает менеджер памяти и как эта память высвобождается. @@ -2194,6 +2236,8 @@ HTTPS — расширение протокола HTTP, поддерживающ - [GitHub - pkolt/design_patterns: Паттерны проектирования](https://github.com/pkolt/design_patterns) - [GitHub - faif/python-patterns: A collection of design patterns/idioms in Python](https://github.com/faif/python-patterns) - [Python Design Patterns](https://python-patterns.guide/) +- [Design Patterns in Python: A Series](https://medium.com/@amirm.lavasani/design-patterns-in-python-a-series-f502b7804ae5) +- [A Catalog For Design Patterns in Python](https://towardsdev.com/a-catalog-for-design-patterns-in-python-a1b69493c677) ### Порождающие (Creational) @@ -4906,7 +4950,7 @@ print(quicksort([10, 5, 2, 3])) ## Очередь и стек -Очередь FIFO (first in first out), стрек LIFO (last in first out) +Очередь FIFO (first in first out), стек LIFO (last in first out) ## Дерево @@ -5288,7 +5332,7 @@ Pre-commit check можно использовать например так: Запрос к реляционной базе данных обычно возвращает несколько рядов (записей) данных, но приложение за один раз обрабатывает лишь одну запись. Даже если оно имеет дело одновременно с несколькими рядами (например, выводит данные в форме электронных таблиц), их количество по-прежнему ограничено. Кроме того, при модификации, удалении или добавлении данных рабочей единицей является ряд. В этой ситуации на первый план выступает концепция курсора, и в таком контексте курсор – указатель на ряд. -Курсор в SQL – это область в памяти базы данных, которая предназначена для хранения последнего оператора SQL. Если текущий оператор – запрос к базе данных, в памяти сохраняется и строка данных запроса, называемая текущим значением, или текущей строкой курсора. Указанная область в памяти поименована и доступна для прикладных программ. +Курсор в SQL – это область в памяти базы данных, которая предназначена для хранения последнего оператора SQL. Если текущий оператор – запрос к базе данных, в памяти сохраняется строка данных запроса, называемая текущим значением, или текущей строкой курсора. Указанная область в памяти поименована и доступна для прикладных программ. Обычно курсоры используются для выбора из базы данных некоторого подмножества хранимой в ней информации. В каждый момент времени прикладной программой может быть проверена одна строка курсора. Курсоры часто применяются в операторах SQL, встроенных в написанные на языках процедурного типа прикладные программы. Некоторые из них неявно создаются сервером базы данных, в то время как другие определяются программистами. diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..5db72dd --- /dev/null +++ b/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended" + ] +}