Python tricks | Хитрости Питона
6.53K subscribers
2.11K photos
26 videos
1 file
2.42K links
Здесь вы найдете лучшие практики и приёмы, которые используют опытные программисты.

Сотрудничество: @SIeep_Token

Мы на платформе: https://telegram.me/python_tricks

Ссылка на канал: https://t.me/+QayZf6ccsQllZTYy
Download Telegram
Создание последовательностей (ч.8)

В данном примере класс CustomList определяет метод contains(self, item), который проверяет наличие элемента item в списке self.items. При использовании оператора in для объекта CustomList, вызывается метод contains, который возвращает True, если элемент найден в списке, и False, если элемент отсутствует.

Этот лайфхак полезен для создания пользовательских коллекций или структур данных, которые могут поддерживать проверку наличия элементов посредством оператора in. Переопределение метода contains позволяет определить, как будет работать проверка наличия элементов в вашем объекте, что может быть полезно для удобства использования вашей структуры данных в Python.

🔗 Python tricks
Глубокое копирование (deep copy)

Глубокое копирование нужно для создания полной копии объекта, включая все вложенные объекты. Это важно для изменяемых объектов, таких как списки, чтобы изменения в копии не затрагивали оригинал.

Когда мы вызываем глубокое копирование, происходит следующее:
- Создается новый контейнерный объект (список, словарь и т. д.);
- Для каждого элемента исходного объекта рекурсивно вызывается глубокое копирование:
- Если элемент является изменяемым объектом (списком, словарем), то создается его копия с рекурсивным копированием вложенных элементов;
- Если элемент неизменяемый (число, строка) - он просто копируется как есть;
- Копии вложенных объектов вставляются в копию исходного объекта.

🔗 Python tricks
Унарные операторы (ч.1)

В данном примере класс Number реализует метод neg(self), который переопределяет оператор отрицания - для объектов этого класса. Когда мы используем оператор отрицания для объекта num, Python вызывает метод neg для этого объекта, который возвращает новый объект Number с отрицательным значением атрибута value.

Этот лайфхак полезен для создания объектов, которые могут поддерживать математические операции с помощью перегрузки операторов в Python. Переопределение метода neg позволяет определить поведение объекта при использовании оператора отрицания, что может быть полезно при работе с числами или другими данными, где операция отрицания имеет смысл.

🔗 Python tricks
Унарные операторы (ч.2)

Метод pos(self) в Python вызывается при использовании унарного оператора плюс (+) для объекта. Он позволяет определить поведение объекта при применении унарного плюса к нему.

В данном примере метод pos просто возвращает сам объект без изменений. Это позволяет объекту сохранять своё значение при использовании унарного плюса. Несмотря на то, что в этом примере метод pos не вносит никаких изменений, он может быть полезен для реализации специфического поведения в других контекстах.

🔗 Python tricks
Унарные операторы (ч.3)

Метод abs(self) вызывается при использовании встроенной функции abs() для объекта. Он позволяет определить поведение объекта при вычислении его абсолютного значения.

В примере выше метод abs просто вызывает встроенную функцию abs() для атрибута self.value, что позволяет получить абсолютное значение числа.

Этот лайфхак полезен при создании объектов, которые представляют числовые значения, таких как вектора, комплексные числа или другие структуры данных, где определение абсолютного значения имеет смысл. Переопределение метода abs позволяет объекту поддерживать стандартные математические операции в Python, такие как вычисление модуля числа.

🔗 Python tricks
Унарные операторы (ч.4)

Метод invert(self) в Python вызывается при использовании побитового отрицания ~ для объекта. Он позволяет определить поведение объекта при побитовом инвертировании его значений.

В приведенном примере метод invert просто использует побитовое отрицание ~ для атрибута self.value, что позволяет инвертировать биты числа.

Этот лайфхак полезен при работе с побитовыми операциями, такими как побитовое отрицание, побитовое ИЛИ, И и т. д. Переопределение метода invert позволяет объекту поддерживать более сложные операции с битами, что может быть полезно при работе с битовыми представлениями данных или при написании кода, связанного с низкоуровневыми аспектами.

🔗 Python tricks
Обычные арифметические операторы (ч.1)

Метод add(self, other) позволяет определить поведение объекта при использовании оператора сложения +. В данном примере, если операнд other также является объектом типа Vector, мы складываем соответствующие координаты векторов и возвращаем новый объект Vector, представляющий сумму. Если other не является вектором, мы вызываем исключение TypeError, указывая, что операция не поддерживается.

Этот лайфхак полезен при работе с пользовательскими типами данных, такими как векторы, матрицы и другие структуры данных, где определение операции сложения имеет смысл. Переопределение метода add позволяет объекту поддерживать стандартную математическую операцию сложения в Python.

🔗 Python tricks
Statistics

Библиотека statistics предназначена для вычисления различных статистических характеристик наборов данных.

Одной из полезных функций этой библиотеки является mean(), которая вычисляет среднее арифметическое значение последовательности чисел.

В примере мы вычисляем среднее значение элементов списка data.
Функция mean() принимает последовательность чисел, суммирует их и делит на количество элементов.

🔗 Python tricks
zlib

Библиотека zlib предоставляет функции для сжатия и декомпрессии данных с использованием алгоритма deflate. Она полезна, когда нужно уменьшить размер данных для передачи или хранения.

В примере мы используем функцию crc32(), которая вычисляет контрольную сумму CRC32 для переданных байтовых данных и возвращает целочисленное значение CRC32.
Это может быть полезно для проверки целостности данных, например при передаче файлов.

CRC32 часто используется в архивациях, сетевых протоколах и хранилищах данных для обнаружения ошибок.

🔗 Python tricks
Заменяем часть строки через str.replace()

Функция str.replace() позволяет заменить все вхождения подстроки в строке на другую подстроку, не указывая явно позиции для замены.

В примере мы создали строку text с двумя вхождениями подстроки "Hello".
Далее с помощью метода replace() заменяем "Hello" на "Hi".

Первым аргументом передается строка для замены, вторым - строка, на которую нужно заменить.

🔗 Python tricks
Python-dateutil

Библиотека python-dateutil предоставляет расширенные возможности для работы с датами и временем.

Она может использоваться для:
- Парсинга и форматирования дат;
- Выполнения арифметических операций с датами;
- Работы с часовыми поясами;
- Вычисления разницы между датами.

В примере мы используем библиотеку для получения начала и конца недели по заданной дате.

relativedelta используется для смещения даты на нужные дни недели.
MO(-1) - для получения предыдущего понедельника.
SU - для получения следующего воскресенья.

🔗 Python tricks
Геттеры и сеттеры

Геттеры
и сеттеры - это специальные методы класса, которые используются для управляемого доступа к атрибутам объекта. Они позволяют инкапсулировать реализацию класса и предоставить проверенный интерфейс для манипуляции данными.

- Геттер позволяет получить значение атрибута.
- Сеттер используется для установки значения атрибута.

Преимущества геттеров и сеттеров:

- Контроль доступа к атрибутам класса.
- Валидация данных.
- Возможность добавить дополнительную логику при установке/получении значений.

🔗 Python tricks
optional_return

Функция optional_return в модуле typing используется для определения функций, которые могут возвращать значение или None.
Это позволяет лучше документировать поведение функции и дает подсказки при использовании ее результата, не опасаясь ошибки, если будет возвращен None.

В данном примере функция find_user может вернуть имя пользователя, если оно найдено в списке, или None, если такого имени нет. Благодаря аннотации Optional[str] мы явно указываем, что возвращаемое значение может быть строкой или None.

🔗 Python tricks
Метод setdefault()

Метод setdefault() для словарей - очень полезная вещь, он позволяет задать значение по ключу в словаре, если этого ключа еще нет, а также вернуть значение по этому ключу.

🔗 Python tricks
seekable()

Метод seekable() в Python проверяет, поддерживает ли объект произвольный доступ, то есть чтение или запись в любую позицию файла. Если объект не поддерживает произвольный доступ, то методы seek() и tell() будут недоступны.

🔗 Python tricks
Счетчик ссылок

Каждый созданный объект имеет специальное поле — счетчик ссылок. Он хранит в себе количество ссылающихся на него объектов. Увеличивает свое значение, например, когда используется операция присваивания, или когда объект становится частью списка. При удалении переменной или же при использовании del счетчик ссылок уменьшается на 1. Например, при завершении работы функции, где эта переменная была объявлена.

🔗 Python tricks
Обычные арифметические операторы (ч.2)

Метод sub(self, other) позволяет определить поведение объекта при использовании оператора вычитания -. В данном примере, если операнд other также является объектом типа Vector, мы вычитаем соответствующие координаты векторов и возвращаем новый объект Vector, представляющий разность. Если other не является вектором, мы вызываем исключение TypeError, указывая, что операция не поддерживается.

Этот лайфхак полезен при работе с пользовательскими типами данных, такими как векторы, матрицы и другие структуры данных, где определение операции вычитания имеет смысл. Переопределение метода sub позволяет объекту поддерживать стандартную математическую операцию вычитания в Python.

🔗 Python tricks
Обычные арифметические операторы (ч.3)

Метод mul(self, other) позволяет определить поведение объекта при использовании оператора умножения *. В данном примере, если операнд other является числом (целым или вещественным), мы умножаем соответствующие координаты вектора на это число и возвращаем новый объект Vector, представляющий результат умножения. Если other не является числом, мы вызываем исключение TypeError, указывая, что операция не поддерживается.

Метод rmul(self, other) позволяет поддерживать коммутативность умножения, т.е. возможность умножения числа на вектор (например, 3 * v). Этот метод просто вызывает mul, чтобы обеспечить одинаковое поведение для обеих форм умножения.

Этот лайфхак полезен при работе с пользовательскими типами данных, такими как векторы, где определение операции умножения имеет смысл. Переопределение методов mul и rmul позволяет объекту поддерживать стандартную математическую операцию умножения в Python.

🔗 Python tricks
Обычные арифметические операторы (ч.4)

Класс Matrix реализует метод matmul(self, other), который определяет поведение оператора матричного умножения @.
В методе matmul, проверяется, что число столбцов первой матрицы равно числу строк второй матрицы, так как это условие необходимо для умножения матриц.
Затем создается результатирующая матрица и заполняется нулями.
Умножение матриц выполняется с помощью вложенных циклов.
Результат умножения возвращается в виде новой матрицы.
Этот лайфхак полезен для работы с линейной алгеброй и матричными операциями, где оператор @ позволяет интуитивно и легко выполнять умножение матриц, переопределяя метод matmul для пользовательских классов в Python.

🔗 Python tricks
flush

В Python метод flush() используется для сброса буфера записи на диск. Когда ты пишешь данные в файл, они сначала попадают в буфер (временное хранилище) для повышения производительности. Метод flush() заставляет Python записать все данные из буфера в файл немедленно.

🔗 Python tricks