🐍 Итоги недели в мире Python и обзоры новых инструментов: как сделать генератор резюме на Python
Привет!
Всю неделю мы мониторим интернет, чтобы в воскресенье прислать тебе интересное письмо. Наша цель – держать читателей в курсе последних открытий и тенденций в мире Python. В еженедельных письмах ты найдешь:
- Новые возможности в последних версиях Python
- Работа с базами данных и SQL в Python.
- Веб-разработка на Django и Flask.
- Машинное обучение и анализ данных с помощью Python.
- Автоматизация и работа с API на Python.
- Тестирование и отладка кода на Python.
- Задачи для новичков с решениями.
Странное сравнение чисел в Python; Как сделать генератор резюме на Python; Как использовать Blender в Jupyter Notebook; Как сделать приложение на Streamlit.
🎸 Как Python сравнивает целые и вещественные числа
При сравнении int и float в Python иногда можно получить неожиданные результаты:
Это связано с:
- Представлением конкретных чисел в памяти.
- Деталями алгоритма сравнения целых и вещественных чисел, реализованного в CPython.
Представление чисел в памяти
- В формате IEEE-754 с двойной точностью, используемом для хранения чисел с плавающей запятой, есть ограничение на количество бит, выделенных для представления мантиссы (52 бита). Это означает, что некоторые числа не могут быть представлены точно. В случае с числами 9007199254740992.0 и 9007199254740993.0 происходит именно эта ситуация – оба числа имеют одинаковое бинарное представление в формате IEEE-754, так как в случае 9007199254740993.0 младший значащий бит мантиссы теряется при нормализации. В итоге, внутри Python оба числа представлены как 9007199254740992.0.
- И напротив, число 9007199254740994.0 может быть точно представлено в формате IEEE-754, так как младший значащий бит мантиссы не теряется.
Алгоритм сравнения CPython
При сравнении Python использует специальный алгоритм, который пытается избежать непосредственного сравнения битовых представлений целых и вещественных чисел. Вместо этого алгоритм анализирует знаки, экспоненты в нормализованном представлении и только в конце, если другие случаи не подходят, сравнивает целочисленные части.
С учетом особенностей представления и сравнения получаем:
- 9007199254740992 == 9007199254740992.0 дает True, так как внутренние целочисленные представления равны.
- 9007199254740993 == 9007199254740993.0 дает False, поскольку в соответствии с IEEE-754 9007199254740993.0 представлено в памяти как 9007199254740992.0, и CPython, по сути, сравнивает 9007199254740993 и 9007199254740992.0.
- 9007199254740994 == 9007199254740994.0 дает True, потому что оба числа точно представлены и имеют равные целочисленные части.
Подробный разбор особенностей представления и сравнения чисел – в этой статье.
🐍 Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»
🔧 Инструменты
📜 Работа с JSON
orjson работает быстрее и обращается с JSON данными корректнее, чем стандартная библиотека (и большинство сторонних).
Производительность
- Бибиотека частично написана на Rust, оптимизирована для максимальной производительности при сериализации/десериализации JSON.
- Использует оптимизированные алгоритмы и инструкции процессора для работы с числами с плавающей запятой и целыми числами.
- Эффективно использует память, применяя разделяемые строки-ключи в объектах JSON.
Нативная поддержка типов данных
- Сериализует dataclass в 40-50 раз быстрее, чем другие библиотеки, упаковывая их прямо в объекты JSON
- Нативно работает с numpy.ndarray – в 4-12 раз быстрее других библиотек и с меньшим использованием памяти.
- Поддерживает удобные форматы для datetime, UUID, включая RFC 3339.
- Строгое соответствие стандарту JSON.
- Отклоняет некорректные строки UTF-8 при сериализации/десериализации.
- Не принимает специальные числовые значения Nan, Inf, -Inf.
- Предоставляет возможность строго ограничить диапазон целых чисел до 53 бит.
Дополнительные возможности
- Добавление перевода строки в конец сериализованной строки.
- Отображение времени в формате UTC как "Z" вместо "+00:00".
- Опция для пропуска микросекунд в datetime объектах.
- Возможность сортировать ключи в объектах по алфавиту.
- Произвольные объекты можно сериализовать, указав пользовательскую функцию.
Портируемость
- Работает на Linux (amd64, aarch64, ppc64le, s390x), macOS (amd64, aarch64) и Windows (amd64, x86).
- Не имеет зависимостей, кроме libc.
- Исходный код содержит все зависимости внутри для сборки без подключения к сети.
🐍🎓 Подтянуть свои знания по Python вы можете на нашем телеграм-канале «Библиотека собеса по Python»
🎨 Blender в Jupyter Notebook
ipyblender_experimental позволяет использовать рендеринговый движок Blender в блокнотах Jupyter Notebook. Пока что инструмент совместим только с Python 3.10. Видеоклипы с примерами можно посмотреть в этих твитах – первый, второй.
✨ Шаблон для PyShiny
Шаблон Tapyr упрощает процесс создания и развертывания корпоративных панелей данных (дашбордов) на базе PyShiny:
- Обеспечивает оптимальную структуру кода.
- Предоставляет средства для управления зависимостями, тестирования, контейнеризации и непрерывной интеграции.
- Предусматривает возможность быстрого деплоя на платформе Posit Connect.
🔥 Интересные проекты
✍️ Конструктор резюме
Resume Builder – генератор резюме: содержимое редактируется в файле resume.py, а скрипт resume_builder.py рендерит информацию в виде HTML-страницы. Эту страницу можно конвертировать в PDF (с помощью «Печать в PDF») в браузере. Готовое резюме содержит всю необходимую информацию об опыте работе, навыках и контактах, и занимает одну страницу:
🔍 Метапоисковая система
Метапоисковик не индексирует веб-страницы напрямую, а агрегирует и объединяет результаты из нескольких других поисковых систем и дополнительных источников. Преимущества метапоисковиков:
- Более широкий охват – одновременно ищут по многим обычным поисковикам, давая более полные результаты.
- Конфиденциальность – не отслеживают данные о пользователях, не собирают историю поиска и не создают пользовательские профили, как это делают многие крупные поисковые системы.
- Разнообразие источников – можно искать не только по основным поисковикам, но и по специализированным базам данных, каталогам и т.д.
- Удобство – один поисковый запрос сразу же получает результаты из многих разных мест.
Один из таких метапоисковиков – опенсорсный SearXNG, написанный на Python. SearXNG ведет поиск по 70 различным поисковикам, не отслеживает пользователей и не хранит их данные, и может использоваться с Tor.
🐍🧩 Интересные задачи по Python для практики можно найти на нашем телеграм-канале «Библиотека задач по Python»
🏝️ Фреймворк для фулстек-разработки на Python
Rio – новый фреймворк, который позволяет разрабатывать веб-приложения полностью на Python, без необходимости использовать HTML, CSS или JavaScript. Вот его основные преимущества:
- Отсутствие разделения на фронтенд и бэкенд – Rio прозрачно обрабатывает всю коммуникацию между клиентом и сервером, скрывая детали работы с HTTP-запросами.
- Декларативный интерфейс. Интерфейсы в Rio строятся из повторно используемых компонентов (по примеру React, Flutter и Vue.js). Результат – модульный интерфейс, который легко расширять и поддерживать.
- Более 50 встроенных UI-компонентов на основе Material Design от Google.
- Использование всех современных возможностей Python – аннотаций типов, асинхронного программирования и т. д.
- Совместимость с отладчиком Python – к любому запущенному процессу можно подключиться отладчиком для отслеживания ошибок.
- Универсальность – с помощью фреймворка можно сделать сайт любой сложности, дашборд для анализа и визуализации данных, интерфейс для стороннего API.
И напоследок – туториал по Streamlit для дата-сайентистов. Автор показывает, как создать и опубликовать простое приложение, и сравнивает Streamlit с двумя другими популярными инструментами, которые чаще всего используются при создании DS/ML приложений – Dash и Taipy.
Автор рассылки: Наталья Кайда