Python usecases
Проверяем скорость интернета
Всем нам интересно, какими мощностями мы владеем. Поэтому, для проверки скорости интернета создали скрипт speestest-cli. Он измеряет скорость на основе сайта speedtest.net (http://speedtest.net/).
Установка:
Здесь у нас есть два способа для запуска:
1. Использовать терминал. Просто вводим speedtest-cli в консоль и радуемся (или нет, зависит от вашего провайдера).
2. Запустить из своей программы. На картинке выше можете увидеть пример использования.
Переводим текст в речь
Грустными вечерами, когда становится не с кем поговорить, можно занять свои руки и научить программу общаться с помощью gTTS.
Установка:
Модуль запускается из терминала. Введите gtts-cli ‘hello’ –output hello.mp3, и вы получите аудиофайл с голосом.
Ну а если вам нужно голосовое сопровождение из Python то создайте gTTS(text), сохраните его в файл — save(filename) или запишите в поток байтов с помощью write_to_fp(fp), а затем передайте его в библиотеку для работы с аудио.
Создаём короткие ссылки
Согласитесь, намного приятнее читать текст, если ссылка состоит из 22 символов, а не из 60. Для их укорачивания придумали pyshorteners.
Установка:
Модуль работает с такими сервисами, как bit.ly, tinyurl и другими. Он отправляет запрос на их сервера и возвращает сокращённую ссылку.
Класс Shortener() принимает необязательные параметры, которые могут пригодится сервису (например, api_key). Через точку вы выбираете сайт и вызываете short(link).
Измеряем время выполнения кода
📌 Документация
(https://docs.python.org/3/library/timeit.html)Измерение с помощью time не очень точное — гораздо лучше использовать timeit. Модуль имеет два основных метода: timeit и repeat.
- timet — выполняет код некоторое количество раз и замеряет время выполнения. Первый параметр - код, который надо выполнить, setup — настройка перед стартом, например, импорт библиотеки. number - кол-во повторений.
- repeat - делает тоже самое, что и timeit, только несколько раз. И возвращает не число а список результатов скорости.
Методы строк
- ljust, rjust, center — используются для позиционирования строки. Заполняет её пробелами, слева/справа/сдвухсторон пока её длинна не станет width.
- strip — удаляет лишние символы (r, t, n, пробел) с краёв строки. rstrip и lstrip делают тоже самое, только в конце и начале строки.
- splitlines — разделяет текст на строки. Намного лучше, чем split(‘n’), поскольку проводит некоторые проверки.
Абстрактные классы
Python, несмотря на динамическую типизацию, не лишена абстрактных классов. Это объекты, которые можно только унаследовать и реализовать какие-то функции.
Создаются они с помощью предустановленного модуля abc. Абстрактные классы наследуются от ABC. А абстрактные методы помечаются @abstractmethod.
Зачем они нужны? Они позволяют решить проблемы с динамической типизацией и добавляют подсказки при написании кода. Также они часто используются с паттернами.
Аннотация типов ч.1
Все мы знаем, что Python — язык с динамической типизацией, то есть язык всю работу касаемо типов объект берёт на себя.
Но у такого подхода есть проблема — редактор кода не знает, что может быть на месте какой-то переменной, из-за чего хуже работает автодополнение.
Также можно передать неправильный тип функции. Ей нужен список, а вы передали множество. Функция отработает и ни Python, ни IDE вам ничего не скажут.
Проблему решили с помощью аннотации, они позволяют редактору узнать, какой тип используется, но никак не меняют поведение программы.
Генераторные списки
Это выражения, которые позволяют нам быстро фильтровать или менять списки. Оно напоминает работу map и filter, только читается чуть проще.
Выглядит оно примерно так: {expression} for i in {iterale} if {expression2}. if используется для фильтрации и его добавление не обязательно.
Записываются эти выражения внутри квадратных скобок ([]), таким образом создаётся список. Если нам нужно множество, записываем в {}, если генератор, в ().
Декоратор
Это вызываем объект (например, функция или класс с методом call), которая меняет поведение другой функции.
Создаются они просто. Вы создаёте вызываем объект, который принимает функцию (пусть её имя будет speedtest) и возвращает функцию-обёртку.
Когда вы вызываете speedtest(), на самом деле отрабатывает обёртка, которая потом сама использует полученную функцию.
Работаем с текстом
Если вам надо найти какие-то слова или же заменить их в большом файле, то стоит воспользоваться flashtext.
Установка:
На примере выше лишь малая часть возможностей библиотеки. Подобрее вы, как обычно, можете почитать в документации.
Оформляем текст
Для этого нам нужен textwrap. В модуле довольно много функций, но вот эти основные:
- wrap(text, width=70, …) — Оборачивает текст так, чтобы длина каждой строки не превышала width.
- fill(то же, что и wrap) — сокращение для “n”.join(wrap(text, …)).
- indent(text, prefix) — Добавляет prefix к каждой новой строке.
- shorten(text, width, …, placeholder=’ […]’) — Ограничивает текст до width и добавляет в конце placeholder.
Проверка свойств
Пользователь постоянно пытается запихнуть в программу то, чего там быть не должно. Чтобы избежать странного поведения, данные должны проходить валидацию, и сделать это проще всего с pydantic.
Установка:
Модуль завоевал уважение среди программистов, поскольку работает довольно быстро (сравнение тут (https://pydantic-docs.helpmanual.io/benchmarks/)), не требует много кода, поддерживает множество редакторов кода.
Библиотека занимается не только валидацией, но и решает проблемы с динамической типизацией.
Визуализируем данные
Вы захотели отобразить данные в виде графиков, диаграмм, чтобы они менялись в зависимости от значений слайдеров, но у вас нет опыта разработки в Frontend? Не беда, ведь существует streamlit.
Установка:
Он позволяет быстро создавать странички с разными графиками на Python с минимальным количеством кода. Посмотреть примеры можно введя streamlit hello.
Оформляем текст
Признайте, что чёрно-белый терминал выглядит не очень. Тогда в него можно добавить цвета и поможет с этим rich.
Установка:
Это модуль с огромным количеством функций для украшения текста. Есть добавление цветов, поддержка Markdown, работа с emoji и даже подсветка синтаксиса.
Со всем преимуществами можно познакомится, просто введя python -m rich в терминал.
Форматирование строк
С помощью format() и f-строк мы можем добавлять значения внутрь строк и применять какие-то правила форматирования (заполнить нулями, сместить).
Рассмотрим f-строки. Мы перед строкой ставим букву f, после добавляем в места, где должно быть наше значение фигурные скобочки с именем переменной внутри.
Если надо мы можем добавить правила форматирования, после названия написав двоеточие. Например. :02X переведёт число в шестнадцатеричную систему счисления и заполнит нулями.
Переводим текст в речь
При создании робота, что захватит человечество, желательно научить его говорить. Сделать это можно с помощью модуля pyttsx3.
Установка:
Если ошибка при импорте модуля win32com или win32api, то введите pip install pypiwin32Им пользоваться довольно легко, достаточно функций: say(text), save_to_file(text, filename), runAndWait(). Также вы можете настраивать голос с помощью getProperty(name) и setProperty(name, value).
📌 Документация
Работаем с буфером обмена
pyperclip выполняет самые простые функции по копированию и считыванию текста.
Установка:
Вот, что она умеет:
- copy(text: str) — получает строку и записывает её в буфер обмена
- paste() — возвращает текст из буфера. Также у терминалов есть фича, как копирования при выделении, она использует другой буфер. Чтобы его использовать, добавьте primary=True.
Упрощаем работу с SQL
Автор FastAPI придумал SQLModel, который упрощает работу с базами данных. Он объединяет в себе Pydantic и SQLAlchemy.
Установка:
Таким образом работу с движком БД мы перекладываем на SQLAlchemy, а обработку данных, проверку и перевод в нужный тип на Pydantic.
Кстати, библиотека хорошо работает с fastapi. Вряд-ли это из-за того, что автор один и тот же.
Геттеры и сеттеры
Это функции, которые вызываются при попытке получить (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[], который может хранить в себе любое животное. Это и есть паттерн стратегия.
Юнит и интеграционные тесты
Юнит-тестирование предусматривает тестирование конкретных объектов и их методов по отдельности. Такой тип тестов легко писать и с ними легче найти конкретное место появления ошибки.
Интеграционное тестирование тестирует как разные объекты взаимодействуют друг с другом. Глобально такие тесты считаются полезнее и надёжнее, так как тестируют саму суть работы программы.