Прыжки по массиву
Дан целочисленный массив nums. Изначально вы располагаетесь на первом индексе массива, и каждый элемент массива представляет собой максимальную длину вашего прыжка на этой позиции.
Возвращается true, если вы можете достичь последнего индекса, или false в противном случае.
Решение: создаем переменную farthest, которая будет хранить самый дальний индекс, до которого можно добраться. Затем проходим по nums и для каждого элемента проверяем, можно ли добраться до него из текущего положения (if i > farthest):
- Если это невозможно, то алгоритм возвращает False, так как мы не можем добраться до последнего элемента.
- Если это возможно, то алгоритм обновляет значение переменной farthest, если текущий элемент позволяет добраться дальше (if nums[i] + i > farthest).
- Если значение переменной farthest больше или равно индексу последнего элемента списка, то алгоритм возвращает True, так как мы можем добраться до последнего элемента.
🔗 Python tricks
Дан целочисленный массив nums. Изначально вы располагаетесь на первом индексе массива, и каждый элемент массива представляет собой максимальную длину вашего прыжка на этой позиции.
Возвращается true, если вы можете достичь последнего индекса, или false в противном случае.
Решение: создаем переменную farthest, которая будет хранить самый дальний индекс, до которого можно добраться. Затем проходим по nums и для каждого элемента проверяем, можно ли добраться до него из текущего положения (if i > farthest):
- Если это невозможно, то алгоритм возвращает False, так как мы не можем добраться до последнего элемента.
- Если это возможно, то алгоритм обновляет значение переменной farthest, если текущий элемент позволяет добраться дальше (if nums[i] + i > farthest).
- Если значение переменной farthest больше или равно индексу последнего элемента списка, то алгоритм возвращает True, так как мы можем добраться до последнего элемента.
🔗 Python tricks
Перезагрузка оператора
Python поддерживает перезагрузку оператора. Зная эти слова, вы сразу кажитесь настоящим компьютерным гением.
На самом деле, концепция довольно проста. Вы когда-нибудь задавались вопросом, почему в Python можно использовать оператор + для добавления чисел и конкатенации строк? Это и есть перезагрузка оператора в чистом виде.
Вы можете определить объекты, которые будут пользоваться стандартными символами операторов Python по-своему. Тогда их можно будет использовать в зависимости от содержимого объектов, с которыми вы работаете.
🔗 Python tricks
Python поддерживает перезагрузку оператора. Зная эти слова, вы сразу кажитесь настоящим компьютерным гением.
На самом деле, концепция довольно проста. Вы когда-нибудь задавались вопросом, почему в Python можно использовать оператор + для добавления чисел и конкатенации строк? Это и есть перезагрузка оператора в чистом виде.
Вы можете определить объекты, которые будут пользоваться стандартными символами операторов Python по-своему. Тогда их можно будет использовать в зависимости от содержимого объектов, с которыми вы работаете.
🔗 Python tricks
Декоратор
Один из распространенных способов использования методов класса — это создание фабричных методов, которые возвращают новые экземпляры класса.
В этом примере мы определяем класс MyClass с методом __init__, который принимает один аргумент value. Затем определяем метод класса from_string, который принимает строку и преобразует ее в целое число с помощью функции int. Метод возвращает новый экземпляр класса MyClass, созданный с помощью переданного значения.
Метод класса определяется с помощью декоратора
🔗 Python tricks
@classmethod
Декоратор @classmethod
используется для создания методов класса. Метод класса — это метод, который привязан к классу, а не к его экземпляру. Это означает, что вы можете вызвать метод класса на самом классе, а не на его экземпляре.Один из распространенных способов использования методов класса — это создание фабричных методов, которые возвращают новые экземпляры класса.
В этом примере мы определяем класс MyClass с методом __init__, который принимает один аргумент value. Затем определяем метод класса from_string, который принимает строку и преобразует ее в целое число с помощью функции int. Метод возвращает новый экземпляр класса MyClass, созданный с помощью переданного значения.
Метод класса определяется с помощью декоратора
@classmethod
и принимает первым аргументом ссылку на сам класс (обычно называемую cls). Внутри метода мы используем эту ссылку для создания и возврата нового экземпляра класса.🔗 Python tricks
TPOT
TPOT (Tree-based Pipeline Optimization Tool) — это библиотека с открытым исходным кодом для автоматизированного машинного обучения (AutoML). Она использует популярную библиотеку Scikit-Learn для преобразования данных и алгоритмов машинного обучения.
Один из примеров использования TPOT — это автоматическое создание и оптимизация конвейера машинного обучения. Выше предоставлен пример кода, который демонстрирует, как использовать TPOT для этой цели:
В этом примере мы импортируем класс TPOTClassifier и загружаем набор данных iris из библиотеки Scikit-Learn. С помощью функции train_test_split мы разделяем набор данных на обучающий и тестовый.
Далее создается экземпляр классификатора TPOT с заданными параметрами generations, population_size и verbosity. Классификатор обучается с помощью метода fit и оценивается с помощью метода score.
В конце оптимизированный конвейер экспортируется в виде скрипта Python с помощью метода export.
🔗 Python tricks
TPOT (Tree-based Pipeline Optimization Tool) — это библиотека с открытым исходным кодом для автоматизированного машинного обучения (AutoML). Она использует популярную библиотеку Scikit-Learn для преобразования данных и алгоритмов машинного обучения.
Один из примеров использования TPOT — это автоматическое создание и оптимизация конвейера машинного обучения. Выше предоставлен пример кода, который демонстрирует, как использовать TPOT для этой цели:
В этом примере мы импортируем класс TPOTClassifier и загружаем набор данных iris из библиотеки Scikit-Learn. С помощью функции train_test_split мы разделяем набор данных на обучающий и тестовый.
Далее создается экземпляр классификатора TPOT с заданными параметрами generations, population_size и verbosity. Классификатор обучается с помощью метода fit и оценивается с помощью метода score.
В конце оптимизированный конвейер экспортируется в виде скрипта Python с помощью метода export.
🔗 Python tricks
Создание последовательностей (ч.3)
setitem(self, key, value) — вызывается при присваивании какого-либо значения элементу в последовательности. Также может выбрасывать исключения TypeError и KeyError.
🔗 Python tricks
setitem(self, key, value) — вызывается при присваивании какого-либо значения элементу в последовательности. Также может выбрасывать исключения TypeError и KeyError.
🔗 Python tricks
Создание последовательностей (ч.4)
В данном примере класс CustomDict реализует метод delitem(self, key), который позволяет удалять элементы из словаря, используемого внутри объекта. Когда мы используем оператор del my_dict['b'], вызывается метод my_dict.delitem('b'), который удаляет элемент с ключом 'b' из словаря _data.
Этот лайфхак полезен при создании собственных коллекций или структур данных в Python. Переопределение метода delitem позволяет определить, как будет происходить удаление элементов из вашей структуры данных. Это может быть полезно для реализации специфической логики удаления или обработки таких операций.
🔗 Python tricks
В данном примере класс CustomDict реализует метод delitem(self, key), который позволяет удалять элементы из словаря, используемого внутри объекта. Когда мы используем оператор del my_dict['b'], вызывается метод my_dict.delitem('b'), который удаляет элемент с ключом 'b' из словаря _data.
Этот лайфхак полезен при создании собственных коллекций или структур данных в Python. Переопределение метода delitem позволяет определить, как будет происходить удаление элементов из вашей структуры данных. Это может быть полезно для реализации специфической логики удаления или обработки таких операций.
🔗 Python tricks
Создание последовательностей (ч.5)
В данном примере класс DefaultDict наследует функционал от класса dict и переопределяет метод missing(self, key). Этот метод вызывается, когда происходит попытка получить значение по ключу, который отсутствует в словаре.
В методе missing мы определяем поведение для несуществующих ключей: создаем ключ с заданным значением по умолчанию и возвращаем это значение. Это позволяет создать словарь, который автоматически возвращает значения по умолчанию для несуществующих ключей, что может быть удобно при работе с данными, где требуется заданное значение по умолчанию для всех ключей.
Такой подход полезен, когда вы хотите упростить работу с отсутствующими ключами в словаре и предоставить значению по умолчанию без явного создания сложных логических конструкций или проверок наличия ключей.
🔗 Python tricks
В данном примере класс DefaultDict наследует функционал от класса dict и переопределяет метод missing(self, key). Этот метод вызывается, когда происходит попытка получить значение по ключу, который отсутствует в словаре.
В методе missing мы определяем поведение для несуществующих ключей: создаем ключ с заданным значением по умолчанию и возвращаем это значение. Это позволяет создать словарь, который автоматически возвращает значения по умолчанию для несуществующих ключей, что может быть удобно при работе с данными, где требуется заданное значение по умолчанию для всех ключей.
Такой подход полезен, когда вы хотите упростить работу с отсутствующими ключами в словаре и предоставить значению по умолчанию без явного создания сложных логических конструкций или проверок наличия ключей.
🔗 Python tricks
Создание последовательностей (ч.6)
В данном примере класс Squares реализует метод iter(self), который возвращает итератор. Итератор - это объект, который поддерживает метод next() и используется для итерации по последовательности значений. Когда мы используем цикл for для объекта squares, интерпретатор Python вызывает метод iter для получения итератора, а затем последовательно вызывает метод next до тех пор, пока не будет возбуждено исключение StopIteration.
Метод iter возвращает сам объект, потому что он также является итератором. Это удобно, когда мы создаем объекты, которые могут быть использованы в циклах for или других контекстах, требующих итерации.
Этот лайфхак полезен при создании собственных итерируемых объектов в Python, что позволяет использовать их в стандартных итерационных конструкциях и управлять процессом итерации с помощью методов iter и next.
🔗 Python tricks
В данном примере класс Squares реализует метод iter(self), который возвращает итератор. Итератор - это объект, который поддерживает метод next() и используется для итерации по последовательности значений. Когда мы используем цикл for для объекта squares, интерпретатор Python вызывает метод iter для получения итератора, а затем последовательно вызывает метод next до тех пор, пока не будет возбуждено исключение StopIteration.
Метод iter возвращает сам объект, потому что он также является итератором. Это удобно, когда мы создаем объекты, которые могут быть использованы в циклах for или других контекстах, требующих итерации.
Этот лайфхак полезен при создании собственных итерируемых объектов в Python, что позволяет использовать их в стандартных итерационных конструкциях и управлять процессом итерации с помощью методов iter и next.
🔗 Python tricks
Создание последовательностей (ч.7)
В данном примере класс CustomList реализует метод reversed(self), который возвращает обратный итератор для списка self.items. Этот метод используется при вызове встроенной функции reversed() для объекта CustomList, что позволяет итерироваться по элементам списка в обратном порядке.
Метод reversed возвращает обратный итератор, что делает его удобным для работы с пользовательскими коллекциями или структурами данных, позволяя легко итерироваться в обратном направлении без необходимости явно создавать обратный список или использовать другие методы.
Этот лайфхак полезен, когда вам нужно итерироваться по вашим объектам в обратном порядке, и вы хотите использовать стандартные инструменты Python для этой задачи.
🔗 Python tricks
В данном примере класс CustomList реализует метод reversed(self), который возвращает обратный итератор для списка self.items. Этот метод используется при вызове встроенной функции reversed() для объекта CustomList, что позволяет итерироваться по элементам списка в обратном порядке.
Метод reversed возвращает обратный итератор, что делает его удобным для работы с пользовательскими коллекциями или структурами данных, позволяя легко итерироваться в обратном направлении без необходимости явно создавать обратный список или использовать другие методы.
Этот лайфхак полезен, когда вам нужно итерироваться по вашим объектам в обратном порядке, и вы хотите использовать стандартные инструменты Python для этой задачи.
🔗 Python tricks
Дано целое число, преобразовать его в римскую цифру.
В этом решении мы создаем метод intToRoman, который принимает целое число в качестве аргумента и возвращает его римское представление в виде строки.
Метод использует жадный алгоритм для поиска наибольшего римского числа, которое может быть вычтено из входного числа. Затем он вычитает это число и добавляет соответствующее римское число к результату.
Этот процесс повторяется до тех пор, пока входное число не станет равным нулю.
🔗 Python tricks
В этом решении мы создаем метод intToRoman, который принимает целое число в качестве аргумента и возвращает его римское представление в виде строки.
Метод использует жадный алгоритм для поиска наибольшего римского числа, которое может быть вычтено из входного числа. Затем он вычитает это число и добавляет соответствующее римское число к результату.
Этот процесс повторяется до тех пор, пока входное число не станет равным нулю.
🔗 Python tricks
Starlette
Starlette — это легковесный ASGI фреймворк/набор инструментов, который идеально подходит для создания асинхронных веб-сервисов на Python.
Он готов к использованию в продакшене и предлагает следующие возможности:
- легковесный, низкосложный HTTP веб-фреймворк;
- поддержка WebSocket;
- фоновые задачи в процессе;
- события запуска и остановки;
- тестовый клиент, построенный на httpx.
В этом примере создается приложение Starlette с одним маршрутом, который обрабатывается функцией homepage. Эта функция возвращает JSON-ответ с сообщением “Hello, world”.
Чтобы запустить это приложение, необходимо установить ASGI-сервер, например uvicorn, и выполнить следующую команду: uvicorn example:app, где example — это имя файла с кодом приложения, а app — имя переменной с экземпляром приложения Starlette.
🔗 Python tricks
Starlette — это легковесный ASGI фреймворк/набор инструментов, который идеально подходит для создания асинхронных веб-сервисов на Python.
Он готов к использованию в продакшене и предлагает следующие возможности:
- легковесный, низкосложный HTTP веб-фреймворк;
- поддержка WebSocket;
- фоновые задачи в процессе;
- события запуска и остановки;
- тестовый клиент, построенный на httpx.
В этом примере создается приложение Starlette с одним маршрутом, который обрабатывается функцией homepage. Эта функция возвращает JSON-ответ с сообщением “Hello, world”.
Чтобы запустить это приложение, необходимо установить ASGI-сервер, например uvicorn, и выполнить следующую команду: uvicorn example:app, где example — это имя файла с кодом приложения, а app — имя переменной с экземпляром приложения Starlette.
🔗 Python tricks
Перегрузка операторов сравнения
Перегрузка операторов сравнения позволяет определить поведение операторов сравнения (таких как ==, !=, <, >, <= и >=) для экземпляров пользовательских классов. Это может быть полезно, когда вы хотите сравнивать объекты на основе определенных атрибутов или свойств.
В этом примере мы определяем класс Person с атрибутами name и age. Затем мы перегружаем операторы сравнения, чтобы они сравнивали объекты Person на основе их возраста. Например, оператор == возвращает True, если возраст двух объектов Person равен, иначе возвращает False.
🔗 Python tricks
Перегрузка операторов сравнения позволяет определить поведение операторов сравнения (таких как ==, !=, <, >, <= и >=) для экземпляров пользовательских классов. Это может быть полезно, когда вы хотите сравнивать объекты на основе определенных атрибутов или свойств.
В этом примере мы определяем класс Person с атрибутами name и age. Затем мы перегружаем операторы сравнения, чтобы они сравнивали объекты Person на основе их возраста. Например, оператор == возвращает True, если возраст двух объектов Person равен, иначе возвращает False.
🔗 Python tricks
Дана входная строка s, необходимо изменить порядок слов в строке на противоположный.
Слово определяется как последовательность символов, не содержащих пробелов. Слова в s будут разделены как минимум одним пробелом.
Вернуть строку, состоящую из слов в обратном порядке, объединенных одним пробелом.
*s может содержать начальные или конечные пробелы, а также несколько пробелов между двумя словами. Возвращаемая строка должна содержать только один пробел, разделяющий слова.
Чтобы решить данную задачу нам необходимо:
- Удалить начальные и конечные пробелы, а также уменьшить количество пробелов между словами до одного.
- Разбить строку на отдельные слова и сохранить в списке.
- Поменять порядок слов в списке на обратный с помощью метода reverse().
- Объединить слова в строку, разделенную одним пробелом, и вернуть результат.
🔗 Python tricks
Слово определяется как последовательность символов, не содержащих пробелов. Слова в s будут разделены как минимум одним пробелом.
Вернуть строку, состоящую из слов в обратном порядке, объединенных одним пробелом.
*s может содержать начальные или конечные пробелы, а также несколько пробелов между двумя словами. Возвращаемая строка должна содержать только один пробел, разделяющий слова.
Чтобы решить данную задачу нам необходимо:
- Удалить начальные и конечные пробелы, а также уменьшить количество пробелов между словами до одного.
- Разбить строку на отдельные слова и сохранить в списке.
- Поменять порядок слов в списке на обратный с помощью метода reverse().
- Объединить слова в строку, разделенную одним пробелом, и вернуть результат.
🔗 Python tricks
Boltons.iterutils
Boltons — это набор из более чем 230 утилит на чистом Python, распространяемых по лицензии BSD, которые дополняют стандартную библиотеку. А iterutils — модуль, который предоставляет множество полезных функций для работы с итераторами.
В примере мы используем следующие функции:
- chunked: разделяет список на чанки заданного размера.
- windowed: возвращает скользящее окно заданного размера из списка.
- pairwise: возвращает пары соседних элементов из списка.
- split: разделяет список на две части по заданному условию.
- split_at: разделяет список на две части по заданному индексу.
🔗 Python tricks
Boltons — это набор из более чем 230 утилит на чистом Python, распространяемых по лицензии BSD, которые дополняют стандартную библиотеку. А iterutils — модуль, который предоставляет множество полезных функций для работы с итераторами.
В примере мы используем следующие функции:
- chunked: разделяет список на чанки заданного размера.
- windowed: возвращает скользящее окно заданного размера из списка.
- pairwise: возвращает пары соседних элементов из списка.
- split: разделяет список на две части по заданному условию.
- split_at: разделяет список на две части по заданному индексу.
🔗 Python tricks
PySnooper
PySnooper — это библиотека для отладки, которая позволяет логгировать каждую строку выполняемого кода вместе со значениями переменных. Она полезна, когда нужно понять, как работает код и где происходят изменения переменных.
Для использования необходимо декорировать функцию, которую нужно отладить с помощью
Результат использования pysnooper предоставлен на изображении.
🔗 Python tricks
PySnooper — это библиотека для отладки, которая позволяет логгировать каждую строку выполняемого кода вместе со значениями переменных. Она полезна, когда нужно понять, как работает код и где происходят изменения переменных.
Для использования необходимо декорировать функцию, которую нужно отладить с помощью
@pysnooper.snoop()
. Вид лога можно настроить с помощью параметров: variables — какие переменные отображать, depth — максимальная вложенность структур данных, prefix — префикс для каждой строки лога.Результат использования pysnooper предоставлен на изображении.
🔗 Python tricks
List и Tuple — зачем нужны и какие отличия
List и Tuple — это два основных типа данных для хранения последовательностей.
List (список) — изменяемый тип данных, можно добавлять, удалять и изменять элементы.
Tuple (кортеж) — неизменяемый тип данных, элементы нельзя изменить после создания.
Основные отличия:
- Списки изменяемые, кортежи - нет;
- Списки удобнее для добавления/удаления элементов;
- Кортежи более эффективны по памяти и быстрее для доступа к элементам.
Для хранения постоянных данных лучше использовать кортежи, а для изменяемых данных — списки.
🔗 Python tricks
List и Tuple — это два основных типа данных для хранения последовательностей.
List (список) — изменяемый тип данных, можно добавлять, удалять и изменять элементы.
Tuple (кортеж) — неизменяемый тип данных, элементы нельзя изменить после создания.
Основные отличия:
- Списки изменяемые, кортежи - нет;
- Списки удобнее для добавления/удаления элементов;
- Кортежи более эффективны по памяти и быстрее для доступа к элементам.
Для хранения постоянных данных лучше использовать кортежи, а для изменяемых данных — списки.
🔗 Python tricks
Дан целочисленный массив nums, вернуть [nums[i], nums[j], nums[k]] такие, что nums[i] + nums[j] + nums[k] == 0.
В нашем решении сначала список nums сортируется. Затем перебираются все возможные комбинации индексов i, j и k. Их сумма проверяется на равенство target и добавляется в результирующий сет, если равна.
🔗 Python tricks
В нашем решении сначала список nums сортируется. Затем перебираются все возможные комбинации индексов i, j и k. Их сумма проверяется на равенство target и добавляется в результирующий сет, если равна.
🔗 Python tricks
Mypy
Mypy — это статический анализатор типов для Python. Он позволяет добавить статическую типизацию в Python и выявлять ошибки, связанные с типами, на этапе компиляции.
Для использования Mypy нужно аннотировать переменные специальным синтаксисом, в примере мы указали, что функция sum_list принимает список целых чисел и возвращает целое число.
После запуска, если типы не совпадают, Mypy выдаст ошибку, как показано в примере.
🔗 Python tricks
Mypy — это статический анализатор типов для Python. Он позволяет добавить статическую типизацию в Python и выявлять ошибки, связанные с типами, на этапе компиляции.
Для использования Mypy нужно аннотировать переменные специальным синтаксисом, в примере мы указали, что функция sum_list принимает список целых чисел и возвращает целое число.
После запуска, если типы не совпадают, Mypy выдаст ошибку, как показано в примере.
🔗 Python tricks
MongoDB: Find
В MongoDB ты можешь использовать методы find() и find one() для поиска данных в коллекции. Точно так же, как оператор SELECT используется для поиска данных в таблице базы данных MySQL. Метод find one() возвращает первое вхождение в выборке. Метод find() возвращает все вхождения в выборке.
🔗 Python tricks
В MongoDB ты можешь использовать методы find() и find one() для поиска данных в коллекции. Точно так же, как оператор SELECT используется для поиска данных в таблице базы данных MySQL. Метод find one() возвращает первое вхождение в выборке. Метод find() возвращает все вхождения в выборке.
🔗 Python tricks
Создание последовательностей (ч.8)
В данном примере класс CustomList определяет метод contains(self, item), который проверяет наличие элемента item в списке self.items. При использовании оператора in для объекта CustomList, вызывается метод contains, который возвращает True, если элемент найден в списке, и False, если элемент отсутствует.
Этот лайфхак полезен для создания пользовательских коллекций или структур данных, которые могут поддерживать проверку наличия элементов посредством оператора in. Переопределение метода contains позволяет определить, как будет работать проверка наличия элементов в вашем объекте, что может быть полезно для удобства использования вашей структуры данных в Python.
🔗 Python tricks
В данном примере класс CustomList определяет метод contains(self, item), который проверяет наличие элемента item в списке self.items. При использовании оператора in для объекта CustomList, вызывается метод contains, который возвращает True, если элемент найден в списке, и False, если элемент отсутствует.
Этот лайфхак полезен для создания пользовательских коллекций или структур данных, которые могут поддерживать проверку наличия элементов посредством оператора in. Переопределение метода contains позволяет определить, как будет работать проверка наличия элементов в вашем объекте, что может быть полезно для удобства использования вашей структуры данных в Python.
🔗 Python tricks
Глубокое копирование (deep copy)
Глубокое копирование нужно для создания полной копии объекта, включая все вложенные объекты. Это важно для изменяемых объектов, таких как списки, чтобы изменения в копии не затрагивали оригинал.
Когда мы вызываем глубокое копирование, происходит следующее:
- Создается новый контейнерный объект (список, словарь и т. д.);
- Для каждого элемента исходного объекта рекурсивно вызывается глубокое копирование:
- Если элемент является изменяемым объектом (списком, словарем), то создается его копия с рекурсивным копированием вложенных элементов;
- Если элемент неизменяемый (число, строка) - он просто копируется как есть;
- Копии вложенных объектов вставляются в копию исходного объекта.
🔗 Python tricks
Глубокое копирование нужно для создания полной копии объекта, включая все вложенные объекты. Это важно для изменяемых объектов, таких как списки, чтобы изменения в копии не затрагивали оригинал.
Когда мы вызываем глубокое копирование, происходит следующее:
- Создается новый контейнерный объект (список, словарь и т. д.);
- Для каждого элемента исходного объекта рекурсивно вызывается глубокое копирование:
- Если элемент является изменяемым объектом (списком, словарем), то создается его копия с рекурсивным копированием вложенных элементов;
- Если элемент неизменяемый (число, строка) - он просто копируется как есть;
- Копии вложенных объектов вставляются в копию исходного объекта.
🔗 Python tricks