Python usecases

Проверяем скорость интернета

Всем нам интересно, какими мощностями мы владеем. Поэтому, для проверки скорости интернета создали скрипт speestest-cli. Он измеряет скорость на основе сайта speedtest.net (http://speedtest.net/).

Установка:

pip install speedtest-cli

Здесь у нас есть два способа для запуска: 1. Использовать терминал. Просто вводим speedtest-cli в консоль и радуемся (или нет, зависит от вашего провайдера).
2. Запустить из своей программы. На картинке выше можете увидеть пример использования.

Переводим текст в речь

Грустными вечерами, когда становится не с кем поговорить, можно занять свои руки и научить программу общаться с помощью gTTS.

Установка:

pip install gTTS

Модуль запускается из терминала. Введите gtts-cli ‘hello’ –output hello.mp3, и вы получите аудиофайл с голосом.

Ну а если вам нужно голосовое сопровождение из Python то создайте gTTS(text), сохраните его в файл — save(filename) или запишите в поток байтов с помощью write_to_fp(fp), а затем передайте его в библиотеку для работы с аудио.

image-20220417120905376

Создаём короткие ссылки

Согласитесь, намного приятнее читать текст, если ссылка состоит из 22 символов, а не из 60. Для их укорачивания придумали pyshorteners.

Установка:

pip install pyshorteners

Модуль работает с такими сервисами, как bit.ly, tinyurl и другими. Он отправляет запрос на их сервера и возвращает сокращённую ссылку.
Класс Shortener() принимает необязательные параметры, которые могут пригодится сервису (например, api_key). Через точку вы выбираете сайт и вызываете short(link).

image-20220417120958497

Измеряем время выполнения кода

📌 Документация

(https://docs.python.org/3/library/timeit.html)Измерение с помощью time не очень точное — гораздо лучше использовать timeit. Модуль имеет два основных метода: timeit и repeat.

  • timet — выполняет код некоторое количество раз и замеряет время выполнения. Первый параметр - код, который надо выполнить, setup — настройка перед стартом, например, импорт библиотеки. number - кол-во повторений.
  • repeat - делает тоже самое, что и timeit, только несколько раз. И возвращает не число а список результатов скорости.

image-20220417121157630

Методы строк

  • ljust, rjust, center — используются для позиционирования строки. Заполняет её пробелами, слева/справа/сдвухсторон пока её длинна не станет width.
  • strip — удаляет лишние символы (r, t, n, пробел) с краёв строки. rstrip и lstrip делают тоже самое, только в конце и начале строки.
  • splitlines — разделяет текст на строки. Намного лучше, чем split(‘n’), поскольку проводит некоторые проверки.

image-20220417122109597

Абстрактные классы

Python, несмотря на динамическую типизацию, не лишена абстрактных классов. Это объекты, которые можно только унаследовать и реализовать какие-то функции.
Создаются они с помощью предустановленного модуля abc. Абстрактные классы наследуются от ABC. А абстрактные методы помечаются @abstractmethod.
Зачем они нужны? Они позволяют решить проблемы с динамической типизацией и добавляют подсказки при написании кода. Также они часто используются с паттернами.

image-20220417122158279

Аннотация типов ч.1

Все мы знаем, что Python — язык с динамической типизацией, то есть язык всю работу касаемо типов объект берёт на себя.
Но у такого подхода есть проблема — редактор кода не знает, что может быть на месте какой-то переменной, из-за чего хуже работает автодополнение.
Также можно передать неправильный тип функции. Ей нужен список, а вы передали множество. Функция отработает и ни Python, ни IDE вам ничего не скажут.
Проблему решили с помощью аннотации, они позволяют редактору узнать, какой тип используется, но никак не меняют поведение программы.

image-20220420223238463

Генераторные списки

Это выражения, которые позволяют нам быстро фильтровать или менять списки. Оно напоминает работу map и filter, только читается чуть проще.
Выглядит оно примерно так: {expression} for i in {iterale} if {expression2}. if используется для фильтрации и его добавление не обязательно.
Записываются эти выражения внутри квадратных скобок ([]), таким образом создаётся список. Если нам нужно множество, записываем в {}, если генератор, в ().

image-20220420223336927

Декоратор

Это вызываем объект (например, функция или класс с методом call), которая меняет поведение другой функции.
Создаются они просто. Вы создаёте вызываем объект, который принимает функцию (пусть её имя будет speedtest) и возвращает функцию-обёртку.
Когда вы вызываете speedtest(), на самом деле отрабатывает обёртка, которая потом сама использует полученную функцию.

image-20220427213731872

Работаем с текстом

Если вам надо найти какие-то слова или же заменить их в большом файле, то стоит воспользоваться flashtext.
Установка:

pip install flashtext
Данный модуль использует свой (https://arxiv.org/abs/1711.00046) алгоритм для поиска слов внутри текста и опережает по скорости regex.

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

image-20220427214026554

Оформляем текст

Для этого нам нужен textwrap. В модуле довольно много функций, но вот эти основные:

  • wrap(text, width=70, …) — Оборачивает текст так, чтобы длина каждой строки не превышала width.
  • fill(то же, что и wrap) — сокращение для “n”.join(wrap(text, …)).
  • indent(text, prefix) — Добавляет prefix к каждой новой строке.
  • shorten(text, width, …, placeholder=’ […]’) — Ограничивает текст до width и добавляет в конце placeholder.

image-20220503120539418

Проверка свойств

Пользователь постоянно пытается запихнуть в программу то, чего там быть не должно. Чтобы избежать странного поведения, данные должны проходить валидацию, и сделать это проще всего с pydantic.

Установка:

pip install pydantic

Модуль завоевал уважение среди программистов, поскольку работает довольно быстро (сравнение тут (https://pydantic-docs.helpmanual.io/benchmarks/)), не требует много кода, поддерживает множество редакторов кода.

Библиотека занимается не только валидацией, но и решает проблемы с динамической типизацией.

image-20220503120634104

Визуализируем данные

Вы захотели отобразить данные в виде графиков, диаграмм, чтобы они менялись в зависимости от значений слайдеров, но у вас нет опыта разработки в Frontend? Не беда, ведь существует streamlit.

Установка:

pip install streamlit

Он позволяет быстро создавать странички с разными графиками на Python с минимальным количеством кода. Посмотреть примеры можно введя streamlit hello.

image-20220512222958885

Оформляем текст

Признайте, что чёрно-белый терминал выглядит не очень. Тогда в него можно добавить цвета и поможет с этим rich.

Установка:

pip install rich

Это модуль с огромным количеством функций для украшения текста. Есть добавление цветов, поддержка Markdown, работа с emoji и даже подсветка синтаксиса.

Со всем преимуществами можно познакомится, просто введя python -m rich в терминал.

image-20220512223048922

Форматирование строк

С помощью format() и f-строк мы можем добавлять значения внутрь строк и применять какие-то правила форматирования (заполнить нулями, сместить).
Рассмотрим f-строки. Мы перед строкой ставим букву f, после добавляем в места, где должно быть наше значение фигурные скобочки с именем переменной внутри.
Если надо мы можем добавить правила форматирования, после названия написав двоеточие. Например. :02X переведёт число в шестнадцатеричную систему счисления и заполнит нулями.

image-20220512223146002

Переводим текст в речь

При создании робота, что захватит человечество, желательно научить его говорить. Сделать это можно с помощью модуля pyttsx3.

Установка:

pip install pyttsx3
Если ошибка при импорте модуля win32com или win32api, то введите pip install pypiwin32

Им пользоваться довольно легко, достаточно функций: say(text), save_to_file(text, filename), runAndWait(). Также вы можете настраивать голос с помощью getProperty(name) и setProperty(name, value).

📌 Документация

image-20220512223235367

Работаем с буфером обмена

pyperclip выполняет самые простые функции по копированию и считыванию текста.

Установка:

pip install pyperclip

Вот, что она умеет:

  • copy(text: str) — получает строку и записывает её в буфер обмена
  • paste() — возвращает текст из буфера. Также у терминалов есть фича, как копирования при выделении, она использует другой буфер. Чтобы его использовать, добавьте primary=True.

image-20220512223339874

Упрощаем работу с SQL

Автор FastAPI придумал SQLModel, который упрощает работу с базами данных. Он объединяет в себе Pydantic и SQLAlchemy.

Установка:

pip install sqlmodel

Таким образом работу с движком БД мы перекладываем на SQLAlchemy, а обработку данных, проверку и перевод в нужный тип на Pydantic.

Кстати, библиотека хорошо работает с fastapi. Вряд-ли это из-за того, что автор один и тот же.

image-20220620202518688

Геттеры и сеттеры

Это функции, которые вызываются при попытке получить (get) значение переменной или задать (set) его.
Функция c @property используется для получения значения свойства, а вот @имя_свойства.setter для того, чтобы задать его.
Таким образом можно проверять значения, которые задаются или возвращать разные данные в зависимости от ситуации.

Перечисления в Python

Они позволяют заменить непонятные значения на понятные имена. Они лучше чем строки, ведь так меньше вероятность ошибиться.
Есть два базовых класса: Enum и IntEnum. Разница лишь в том, что IntEnum добавляет константам свойства целых чисел (int).
Функция auto() автоматически подставляет следующее значение константе, а @unique проверяет, чтобы значения не повторялись.
Также вы можете создавать пометки с помощью Flag и IntFlag. Разница такая же, как и с Enum и IntEnum.

Два понятия инкапсуляции

✅ Правильное понятие: Инкапсуляция — механизм языка, позволяющий объединить данные и методы в единый объект.

❌ Неправильное понятие: Инкапсуляция — это сокрытие данных одних компонентов к другим.

ℹ️ Отличие: Инкапсуляция позволяет разбивать данные на объекты и, зачастую, скрывать детали реализации от пользователя. Не во всех языках сокрытие существует, но в Java без него никак.

Паттерн “Стратегия”

Представьте что у вас есть класс фермы Farm, который обрабатывает классы Cow, Pig и Chicken. Чтобы хранить их в классе нам нужен массив для них, но в статической Java невозможно сделать массив для разных типов.
Для решения этой ситуации создают интерфейс Animal, который будет имплементироваться всеми классами животных.
Далее в классе Farm делаем массив типо Animal[], который может хранить в себе любое животное. Это и есть паттерн стратегия.

Юнит и интеграционные тесты

Юнит-тестирование предусматривает тестирование конкретных объектов и их методов по отдельности. Такой тип тестов легко писать и с ними легче найти конкретное место появления ошибки.
Интеграционное тестирование тестирует как разные объекты взаимодействуют друг с другом. Глобально такие тесты считаются полезнее и надёжнее, так как тестируют саму суть работы программы.

Cheatsheet