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

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

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

Ссылка на канал: https://t.me/+QayZf6ccsQllZTYy
Download Telegram
​​Превью из длинного текста

Допустим, у нас есть какой-то длинный текст в виде строки и надо сделать превью этого текста. Такую проблему хорошо решает метод shorten из модуля textwrap
Первым аргументом передается строка, вторым указывается количество символов, которое должен содержать результат. Также третьим аргументом можно передать заготовку, которая будет вставляться в конце обрезанной строки.
​​Аннотации типов: Union и Optional

При необходимости допустить использование не любых типов, а только некоторых, можно использовать аннотацию Union[T, ...] с указанием списка типов в квадратных скобках.

Для объявления опциональных переменных используется Optional[T]. Такая аннотация нужна для переменных, которые либо имеют значение определенного типа, либо равны None.
​​Получение индекса максимального элемента в списке

Python не предоставляет процедуры для прямого получения индекса максимального или минимального элемента в списке или кортеже. Представленный ниже код поможет нам в решении данной задачи.

Если есть два или более элементов с максимальным значением, данный алгоритм возвращает индекс последнего.
​​Функция starmap()

Данная функция создает итератор, который вычисляет функцию function, используя аргументы, полученные из кортежей в итерируемой последовательности iterable.

Используется вместо map(), когда параметры функции уже сгруппированы в кортежи из одной итерации, т. е. данные были предварительно упакованы в кортежи.

Параметры:
  function - функция
  iterable - итерируемая последовательность.
​​Функция groupby()

Функция groupby() модуля itertools создает итератор, который возвращает последовательные ключи и группы из итерируемой последовательности iterable.

Ключ key - это функция, вычисляющая значение ключа для каждого элемента. Если ключ не указан или равен None, ключом по умолчанию является функция тождественности и возвращает элемент без изменений. Как правило, iterable уже должна быть отсортирована по той же ключевой функции.
​​Функция multimode()

Функция multimode() модуля statistics возвращает список наиболее часто встречающихся значений элементов в последовательности data в том порядке, в котором они были обнаружены.

Функция statistics.multimode() вернет более одного результата, если в последовательности есть несколько элементов с одинаковым максимальным числом повторений или пустой список, если данные data пусты.
​​match/case в Python 3.10

Часто приходится проверять не только тип данных, но и количество, что приводит к появлению огромного числа веток if/else с вызовом функций isinstance, len и обращению к элементам по индексу, ключу или атрибуту. Именно для упрощения работы и уменьшения if/else был введен новый оператор match/case.
​​Цепочка исключений

Для формирования цепочек исключений используется ключевое слово from, после которого требуется указать ещё одно исключение. Это исключение будет подвязано к вызванному в атрибут __cause__ (поддерживает запись).

В результате, если вызванное исключение не обработано, то на вывод будут отправлены оба исключения.
​​Получаем исходный код объекта

Встроенный модуль inspect помогает разработчикам исследовать уже написанные программы.

Сегодня поговорим только про getsource(), который возвращает весь исходный код функции, класса или модуля в виде строки.

В аргументы достаточно передать необходимый объект. Но важно отметить, что встроенные функции не получится проинспектировать.
​​Форматирование чисел в f-строках 

Начиная с версии Python 3.6, стали доступны f-строки. Это удобный способ форматирования текста. Но не все знают, что он умеет вставлять float числа с настраиваемым количеством знаков после запятой.
​​Генерация капчи

Для этого нам создания капчи нам понадобится модуль captcha и Pillow, который используется для создание изображений в captcha.

Создаем объект изображения ImageCaptcha, на который будет нанесен текст. После чего вызываем метод write с заданным текстом и придуманным названием файла.
​​Получение курса валют

Один из вариантов получения валют - импользование библиотеки forex-python. Установите ее командой pip install forex-python. Данный модуль - это бесплатный API для текущих и исторических обменных курсов, публикуемых Европейским центральным банком. Курсы обновляются ежедневно в 15:00 по европейскому времени.
​​Итерация в обратную сторону

Когда нам нужно проитерироваться по послудовательности в обратном порядке, то функция reversed поможет это сделать
​​Определяем расстояние между двумя точками на Земле 

Для работы с координатами воспользуемся библиотекой geopy, которую установим с помощью команды pip install geopy. В функцию geodesic передадим два кортежа с координатами нужных нам городов.
​​Сортировка пузырьком

Сортировка пузырьком - это метод сортировки массивов и списков путем последовательного сравнения и обмена соседних элементов, если предшествующий оказывается больше последующего.
В процессе выполнения данного алгоритма элементы с большими значениями оказываются в конце списка, а элементы с меньшими значениями постепенно перемещаются по направлению к началу списка. Образно говоря, тяжелые элементы падают на дно, а легкие медленно всплывают подобно пузырькам воздуха.
​​Switch-конструкции

Некоторые языки программирования спользуют switch конструкции, которых нет в python.
Однако существует одно хитрое решение – использовать словарь, где значениями будут функции.
В данном примере мы используем lambda-функции для упрощения кода, но вместо них можете подставить любые другие.
​​Получаем срез из бесконечного генератора

Допустим, мы хотим получить какой-то конечный список элементов из бесконечного генератора.

Для начала создадим сам генератор, который позволяет (за неимением другого слова) "генерировать" числа из последовательности Фибоначчи.

Чтобы получить желаемый срез, импортируем модуль itertools, в котором уже есть удобная функция islice, позволяющая осуществить срез генератора fib.
​​Назначение функций по условию

Наверняка большинство из вас знакомы с тернарным оператором, позволяющим записать простое условное выражение с if:

A = Y if X else Z

Интерпретатор выполняет выражение Y, если объект XTrue, и Z, если XFalse.

Но оказывается, тернарный оператор можно использовать не только для переменных, но и для функций.
​​Ускоряем код с помощью векторизации

Одним из приемов для ускорения работы циклов является векторизация вычислений, т. е. использование функций, которые поддерживают операции над векторами. 

Лучший способ ускорить любой цикл – это отказаться от него. В примере выше для работы с функцией my_func мы могли бы вызвать ее в цикле для каждого элемента списка, но гораздо проще использовать vectorize.

По сути, vectorize преобразует функцию таким образом, что она начинает принимать весь вектор целиком, а не отдельный его элемент. Надо помнить, что такой подход не всегда приводит к значительному ускорению.

Не забудьте установить библиотеку командой pip install numpy
​​Прочитать произвольную строку из файла

Создадим файл text.txt и выведем из нее нужную нам строку.
Нам может помочь функция getline из модуля linecache. В чем главное отличие этой функции от обычного метода чтения из файла? Функция getline кеширует все строчки файла в списке, так что следующие вызовы get_answer отработают моментально.