Какой контент вы хотите чаще видеть на канале?
Anonymous Poll
20%
Квизы и опросы
80%
Обучающие примеры кода
Senior Python Developer
Какой контент вы хотите чаще видеть на канале?
This media is not supported in your browser
VIEW IN TELEGRAM
Паттерн проектирования Singleton
Одиночка или же синглтон – это паттерн проектирования, описывающий объект, у которого имеется один единственный экземпляр.
Метод
В примере мы проверяем, есть ли значение у атрибута
То есть при вызове конструктора класса
Одиночка или же синглтон – это паттерн проектирования, описывающий объект, у которого имеется один единственный экземпляр.
Метод
__new__ вызывается для создания экземпляра класса перед вызовом __init__. На вход первым аргументом метод принимает сам класс, а возвращать должен уже экземпляр (даже можно экземпляр и другого класса).В примере мы проверяем, есть ли значение у атрибута
instance. Если нет, то присваиваем атрибуту экземпляр этого же класса. А если экземпляр уже создан, то просто его возвращаем.То есть при вызове конструктора класса
Singleton будет возвращаться один и тот же объект из памяти.Добавляем классу большую функциональность
Декоратор
Методы класса привязаны к самому классу, а не его экземпляру. Они могут менять состояние класса, что отразится на всех объектах этого класса, но не могут менять конкретный объект.
Короче говоря,
Декоратор
@classmethod — это метод, который получает класс в качестве параметра, который принято обозначать как cls. Он указывает на класс ToyClass, а не на объект этого класса. Методы класса привязаны к самому классу, а не его экземпляру. Они могут менять состояние класса, что отразится на всех объектах этого класса, но не могут менять конкретный объект.
Короче говоря,
@classmethod — это обычный метод класса, имеющий доступ ко всем атрибутам класса, через который он был вызван.Классы данных (Data classes)
Начиная с версии 3.7 Python предлагает классы данных. Есть несколько преимуществ перед обычными классами или другими альтернативами, такими как возвращение нескольких значений или словарей:
🐍 класс данных требует минимального количества кода;
🐍 вы можете сравнить классы данных, потому что существует
🐍 вы можете легко вывести класс данных для отладки, потому что существует
🐍 классы данных требуют тайп хинты, что уменьшает шанс ошибок.
На картинке пример класса данных в работе.
Начиная с версии 3.7 Python предлагает классы данных. Есть несколько преимуществ перед обычными классами или другими альтернативами, такими как возвращение нескольких значений или словарей:
🐍 класс данных требует минимального количества кода;
🐍 вы можете сравнить классы данных, потому что существует
__eq__;🐍 вы можете легко вывести класс данных для отладки, потому что существует
__repr__;🐍 классы данных требуют тайп хинты, что уменьшает шанс ошибок.
На картинке пример класса данных в работе.
Инкремент с помощью __pos__
В Python нет операции инкремента
При применении унарного плюса у объекта вызывается магический метод
Код на картинке может показаться сначала немного сложным, но лучше проследить логику и понять работу метода
В Python нет операции инкремента
++ как в си-подобных языках, поэтому используется x += 1. Однако запись ++x является валидным кодом (но не x++), так как это просто два унарных оператора сложения.При применении унарного плюса у объекта вызывается магический метод
__pos__, то есть запись ++x можно понять как x.__pos__().__pos__(). Зная это, можно реализовать класс, который будет представлять число и поддерживать поведение инкремента.Код на картинке может показаться сначала немного сложным, но лучше проследить логику и понять работу метода
__pos__. Если реализовать все остальные необходимые магические методы, то может получится полноценный класс числа, но в продакшене такие приколы лучше не писать.Дробные числа
По умолчанию числа с плавающей точкой используют память привычным образом, то есть они хранятся в двоичном виде. Это означает, что вы обычно работаете с приблизительными значениями, а не точными.
Можно использовать тип данных
Поэтому для идеальных вычислений лучше использовать
По умолчанию числа с плавающей точкой используют память привычным образом, то есть они хранятся в двоичном виде. Это означает, что вы обычно работаете с приблизительными значениями, а не точными.
Можно использовать тип данных
Decimal, который предоставит намного большую точность, но и его может не хватить в некоторых случаях. Поэтому для идеальных вычислений лучше использовать
Fraction, который представляет и хранит число в виде рациональной дроби.Сортировка объектов по нескольким ключам
Предположим, мы хотим отсортировать список словарей. Но мы не просто хотим сортировать их, допустим, по имени или возрасту, мы хотим отсортировать их по обоим полям.
На самом деле существует очень простое решение этой проблемы, благодаря гарантии Python, что функции сортировки обеспечивают устойчивость сортировки. Это означает, что элементы, которые сравниваются, сохраняют свой первоначальный порядок.
Чтобы добиться сортировки по имени и возрасту, можно воспользоваться примером с картинки. В нем сначала словарь сортируется по возрасту, а потом по имени. С помощью
Имена сортируются в первую очередь, возраст сортируется, если имя совпадает. Таким образом, все Джоны сгруппированы по возрасту.
Предположим, мы хотим отсортировать список словарей. Но мы не просто хотим сортировать их, допустим, по имени или возрасту, мы хотим отсортировать их по обоим полям.
На самом деле существует очень простое решение этой проблемы, благодаря гарантии Python, что функции сортировки обеспечивают устойчивость сортировки. Это означает, что элементы, которые сравниваются, сохраняют свой первоначальный порядок.
Чтобы добиться сортировки по имени и возрасту, можно воспользоваться примером с картинки. В нем сначала словарь сортируется по возрасту, а потом по имени. С помощью
operator.itemgetter() мы получаем поля возраста и имени из каждого словаря в списке.Имена сортируются в первую очередь, возраст сортируется, если имя совпадает. Таким образом, все Джоны сгруппированы по возрасту.
Превью из длинного текста
Допустим, у нас есть какой-то длинный текст в виде строки и надо сделать превью этого текста, например, для сайта. Первое, что приходит на ум – использовать слайсинг строк.
Но, как видите, текст оборвался на полуслове, поэтому такой вариант отпадает. Такую проблему хорошо решает метод
Первым аргументом передается строка, вторым указывается количество символов, которое должен содержать результат. Также третьим аргументом можно передать заготовку, которая будет вставляться в конце обрезанной строки.
Допустим, у нас есть какой-то длинный текст в виде строки и надо сделать превью этого текста, например, для сайта. Первое, что приходит на ум – использовать слайсинг строк.
Но, как видите, текст оборвался на полуслове, поэтому такой вариант отпадает. Такую проблему хорошо решает метод
shorten из модуля textwrap. Первым аргументом передается строка, вторым указывается количество символов, которое должен содержать результат. Также третьим аргументом можно передать заготовку, которая будет вставляться в конце обрезанной строки.
Находим файлы по шаблону
Основной фишкой модуля
В одноименный метод
Вообще модуль является встроенным, но в некоторых ситуациях импорт может выдать исключение. В таком случае надо просто его переустановить через пакетный менеджер
Основной фишкой модуля
glob является удобная и лаконичная работа с поиском файлов по паттернам. Более того, можно даже пройтись по директориям рекурсивно.В одноименный метод
glob передаётся шаблон для поиска файлов, а возвращается список с результатами. Все методы следуют механизму и правилам сопоставления паттернов в стиле Unix. Вообще модуль является встроенным, но в некоторых ситуациях импорт может выдать исключение. В таком случае надо просто его переустановить через пакетный менеджер
pip.FastAPI
Интересно, что автор фреймворка глубоко изучил несколько других фреймворков, от классических, таких как Django, до более современных, таких как Sanic, а также изучил различные технологии в NestJS (веб-фреймворк Node.js, Typescript).
Фреймворк имеет важную особенность – автоматическая генерация документации: как только ваши эндпойнты будут реализованы, вы сможете поиграться с API, используя соответствующий стандартам пользовательский интерфейс. Поддерживаются SwaggerUI, ReDoc и другие.
FastAPI построен на удивительной библиотеке Starlette, в результате чего производительность сравнима с Node.js, а в некоторых случаях даже Go.
Интересно, что автор фреймворка глубоко изучил несколько других фреймворков, от классических, таких как Django, до более современных, таких как Sanic, а также изучил различные технологии в NestJS (веб-фреймворк Node.js, Typescript).
Фреймворк имеет важную особенность – автоматическая генерация документации: как только ваши эндпойнты будут реализованы, вы сможете поиграться с API, используя соответствующий стандартам пользовательский интерфейс. Поддерживаются SwaggerUI, ReDoc и другие.
FastAPI построен на удивительной библиотеке Starlette, в результате чего производительность сравнима с Node.js, а в некоторых случаях даже Go.
Объединение списков без цикла
Как бы вы решили задачу объединения списков разной длины без обхода элементов цикла? На картинке приведены два варианта – с помощью стандартной функции
Заметим, что при работе с последовательностями многие полезные решения находятся в модулях стандартной библиотеки collections (контейнерные структуры данных) и itertools (операции над последовательностями). Внимательное прочтение документации модулей освободит вас от многих часов придумывания собственных «велосипедов».
Как бы вы решили задачу объединения списков разной длины без обхода элементов цикла? На картинке приведены два варианта – с помощью стандартной функции
sum и применение модуля itertools.Заметим, что при работе с последовательностями многие полезные решения находятся в модулях стандартной библиотеки collections (контейнерные структуры данных) и itertools (операции над последовательностями). Внимательное прочтение документации модулей освободит вас от многих часов придумывания собственных «велосипедов».
Разница между генераторными выражениями и генераторами коллекций
Записи в первой и второй строчке в коде выше очень похожи, но различаются видами скобок. В генераторе списка они квадратные, а в генераторном выражении – круглые.
Распечатав переменные, можно заметить, что значением переменной
Если вам нужен результат, например, в виде списка, прямо сейчас для дальнейшего выполнения программы, то используйте генераторы коллекций.
А если же значения понадобятся еще не скоро или неизвестно, понадобятся ли вообще, то предпочтительнее использовать генераторы, чтобы не занимать лишнюю память и не нагружать систему.
Записи в первой и второй строчке в коде выше очень похожи, но различаются видами скобок. В генераторе списка они квадратные, а в генераторном выражении – круглые.
Распечатав переменные, можно заметить, что значением переменной
a является список, а переменная x хранит в себе объект генератора. И здесь возникает вопрос: что же использовать?Если вам нужен результат, например, в виде списка, прямо сейчас для дальнейшего выполнения программы, то используйте генераторы коллекций.
А если же значения понадобятся еще не скоро или неизвестно, понадобятся ли вообще, то предпочтительнее использовать генераторы, чтобы не занимать лишнюю память и не нагружать систему.
Что выведет программа?
Anonymous Quiz
5%
<class 'str'>
5%
<class 'int'>
62%
<class 'float'>
11%
0.99
15%
Error
2%
99
Перегрузка операторов сравнения
В случае, если вам в коде необходимо сравнивать объекты какого-либо класса, требуется реализовать магические методы, которые вызываются при сравнении.
Например, под капотом записи
Писать все шесть методов получается слегка громоздко, поэтому зачастую используют декоратор
В случае, если вам в коде необходимо сравнивать объекты какого-либо класса, требуется реализовать магические методы, которые вызываются при сравнении.
Например, под капотом записи
a < b вызывается a.__lt__(b). Для каждого оператора сравнения есть свой магический метод. Подробнее про то, какой метод за какой оператор отвечает, выше в коде. Писать все шесть методов получается слегка громоздко, поэтому зачастую используют декоратор
total_ordering из functools.Красивые таблицы в терминале
PrettyTable – это библиотека, предназначенная для быстрого и легкого представления табличных данных в виде ASCII. Модуль можно установить обычным способом через
Для создания таблиц и работы с ними используется класс
Более того, модуль
PrettyTable – это библиотека, предназначенная для быстрого и легкого представления табличных данных в виде ASCII. Модуль можно установить обычным способом через
pip.Для создания таблиц и работы с ними используется класс
PrettyTable из этого модуля. Задать название для столбцов можно с помощью атрибута fields_name. Строки в таблицу добавляются путем вызова метода add_row.Более того, модуль
prettytable позволяет регулировать различные параметры, сортировать данные, работать с html, а также взаимодействовать с csv и sql таблицами, так что возможностей у этого модуля предостаточно.Прогресс выполнения программы
Индикаторы прогресса добавляют наглядности в скриптах, которые исполняют какие-то функции, требующие времени для выполнения. Модуль
Привычный
Индикаторы прогресса добавляют наглядности в скриптах, которые исполняют какие-то функции, требующие времени для выполнения. Модуль
tqdm является простым и лаконичным вариантом.Привычный
range можно заменить на trange для визуализации прогресса. А для итерации по какой-либо последовательности достаточно просто передать её в функцию tqdm. Также модуль хорошо себя зарекомендовал и в Jupyter Notebook.JmesPath
Работать с JSON в Python — сплошное удовольствие, ведь он прекрасно отображается в Python-словаре. Кроме того, Python поставляется с собственной библиотекой для создания и анализа, или разбора, JSON. Для меня это одна из лучших функций в Python. Если мне нужно поработать с JSON, то я непременно выберу Python.
Но в стандартном пакете есть и кое-что, чего вам может не хватать. Если вы пользуетесь json.loads(), а данные из словаря получаете вручную (возможно, добавляя какие-то циклы), то готовьтесь сильно удивиться!
JMESPath (читается как «JAMES PATH») делает работу с JSON на Python еще проще. Теперь вы можете декларативно указывать, как извлекать элементы из JSON-документа. На картинке несколько примеров, иллюстрирующих возможности JMESPath.
Почитать подробнее можно в документации.
Работать с JSON в Python — сплошное удовольствие, ведь он прекрасно отображается в Python-словаре. Кроме того, Python поставляется с собственной библиотекой для создания и анализа, или разбора, JSON. Для меня это одна из лучших функций в Python. Если мне нужно поработать с JSON, то я непременно выберу Python.
Но в стандартном пакете есть и кое-что, чего вам может не хватать. Если вы пользуетесь json.loads(), а данные из словаря получаете вручную (возможно, добавляя какие-то циклы), то готовьтесь сильно удивиться!
JMESPath (читается как «JAMES PATH») делает работу с JSON на Python еще проще. Теперь вы можете декларативно указывать, как извлекать элементы из JSON-документа. На картинке несколько примеров, иллюстрирующих возможности JMESPath.
Почитать подробнее можно в документации.