📜 Самая полная шпаргалка по f-строкам
|
F-строки – самый удобный способ форматирования вывода. Эта статья подробно рассказывает о том, как использовать f-строки для форматирования различных типов данных – чисел, процентных величин, даты и времени. Вот основные приемы, которые она охватывает: - Базовый синтаксис для вывода строк, чисел и выражений.
- Форматирование целых чисел с использованием разделителей.
- Контроль точности десятичных знаков.
- Форматирование и контроль точности процентных величин.
- Форматирование чисел в научной экспоненциальной нотации.
- Использование общего кода n для форматирования чисел различных типов с автоматическим выбором наиболее подходящего формата.
- Форматирование дат с использованием различных кодов (%Y для года, %m для месяца, %d для дня и т.д.) и возможностью вывода месяца текстом.
- Форматирование объектов datetime с использованием кодов для часов (%H), минут (%M), секунд (%S) и миллисекунд (%f).
- Изменение формата 24-часового времени на 12-часовой формат с помощью %I и добавление AM/PM с %p.
- Использование дополнительных форматов даты, таких как день года (%j) и неделя года (%W или %U).
- Добавление заполнения пробелами или нулями перед числами с помощью :<ширина>d или :0<ширина>d.
- Добавление знаков + или - перед числами с помощью :+.Xf или :-.Xf.
- Комбинирование нескольких форматов и форматирование переменных с их именами.
|
Автор публикации Clean Code in Python умудрился охватить все принципы и аспекты написания чистого кода. Вот какие темы затрагивает статья: - Определение чистого кода, его важность и преимущества – легкость понимания, эффективность, простота обслуживания, масштабируемости, отладки и рефакторинга.
- Стандарты написания кода – PEP 8, который дает рекомендации по организации файлов, практикам программирования, форматированию кода, соглашениям об именовании и комментариям.
- Принцип питоничного кода, который следует идиомам и парадигмам Python для создания более чистого, читаемого и высокопроизводительного кода.
- Принципы чистого кода – DRY, KISS, разделение ответственности (SoC) и SOLID.
- Инструменты форматирования кода – Black, Flake8 и автоматические линтеры.
- Рекомендации по именованию переменных, функций и классов для улучшения читаемости кода.
- Руководство по написанию чистых функций, включая советы по управлению аргументами, избеганию побочных эффектов и использованию флагов.
- Правила написания комментариев в коде и различия между комментариями и документацией.
- Использование декораторов, контекстных менеджеров, итераторов и генераторов для написания более чистого питоничного кода.
- Модульность, структура проектов и принципы объектно-ориентированного программирования для поддержания организованного кода.
- Важность тестирования для обеспечения качества программного обеспечения и написания чистых тестов.
|
⌛ «O» большое: временная сложность операций со структурами данных в Python
|
Временная сложность алгоритма – это показатель, который описывает, как растет время выполнения алгоритма при увеличении количества входных данных. Знание временных сложностей помогает оценить, насколько хорошо будет работать алгоритм на больших объемах данных, и выбрать наиболее эффективный подход для решения задачи. Представим, что у нас есть список из 10 элементов, и мы хотим найти определенный элемент в этом списке. Мы можем просто пройтись по списку с начала до конца и посмотреть, есть ли там нужный элемент. Для списка из 10 элементов это займет относительно немного времени. Но что если список состоит из 100 элементов? Или из 1000? 1000000? Алгоритм, при котором мы просматриваем весь список, будет работать все медленнее и медленнее по мере роста размера списка. Временная сложность позволяет нам описать, насколько замедлится алгоритм при увеличении входных данных. Для нашего примера с поиском в списке временная сложность будет O(n), где n – размер списка. Это означает, что время выполнения алгоритма растет пропорционально размеру входных данных. Вот основные виды временных сложностей: - O(1) – константное время. Время выполнения операции не зависит от объема входных данных. Пример: len(list) – получение длины списка выполняется за константное время, независимо от размера списка.
- O(n) – линейное время. Время выполнения пропорционально размеру входных данных. Пример: поиск элемента в списке с помощью оператора in (item in some_list) требует линейного просмотра списка.
- O(n^2) – квадратичное время. Очень неэффективные алгоритмы, где время растет квадратично относительно входных данных. Пример: вложенные циклы для обработки всех пар элементов в списке.
- O(n log n) – логарифмическое время. Более эффективные алгоритмы, чем O(n^2), но медленнее, чем O(n). Пример: алгоритм сортировки sorted(list).
- O(log n) – линейно-логарифмическое время. Очень эффективные алгоритмы, время работы которых растет логарифмически от размера входных данных. Пример: двоичный поиск в отсортированном списке.
Более медленные сложности: O(n^3), O(n^2 log n), O(2^n) и т.д. встречаются в повседневном программировании гораздо реже. |
Сравнение временной сложности |
Трей Ханнер написал подробнейшую статью о временной сложности различных операций со структурами данных Python. Автор отмечает, что операции вставки и удаления в списках имеют разную сложность в зависимости от позиции – в конце списка они выполняются очень быстро, а в начале списка – очень медленно (потому что после операции надо сдвинуть вправо все элементы). Вот несколько примеров временной сложности основных операций из статьи: Список (List) - Доступ к элементу по индексу (sequence[index]) – O(1)
- Присваивание элемента по индексу (sequence[index] = value) – O(1)
- Добавление в конец списка (sequence.append(item)) – O(1)
- Удаление с конца списка (sequence.pop()) – O(1)
- Вставка в начало списка (sequence.insert(0, item)) – O(n)
- Удаление из начала списка (sequence.pop(0)) – O(n)
- Проверка на вхождение элемента (item in sequence) – O(n)
- Получение длины списка (len(sequence)) – O(1)
Двусторонняя очередь (Deque) - Добавление в конец (queue.append(item)) – O(1)
- Удаление с конца (queue.pop()) – O(1)
- Добавление в начало (queue.appendleft(item)) – O(1)
- Удаление с начала (queue.popleft()) – O(1)
- Проверка на вхождение элемента (item in queue) – O(n)
Словарь (Dict) - Доступ по ключу (mapping[key]) – O(1)
- Присваивание по ключу (mapping[key] = value) – O(1)
- Удаление по ключу (mapping.pop(key)) – O(1)
- Проверка наличия ключа (key in mapping) – O(1)
- Получение значения по ключу (mapping.get(key)) – O(1)
- Итерирование по паре ключ–значение (for k, v in mapping.items()) – O(n)
Множество (Set) - Добавление элемента (my_set.add(item)) – O(1)
- Удаление элемента (my_set.remove(item)) – O(1)
- Проверка на вхождение элемента (item in my_set) – O(1)
- Итерирование по элементам множества (for item in my_set) – O(n)
Куча (Heap) - Создание кучи из списка (heapq.heapify(sequence)) – O(n)
- Извлечение минимума (heapq.heappop(sequence)) – O(log n)
- Добавление элемента (heapq.heappush(sequence, item)) – O(log n)
- Бинарный поиск в отсортированном списке (bisect):
- Получение индекса для вставки (bisect.bisect(sorted_seq, item)) – O(log n)
- Вставка с сохранением сортировки (bisect.insort(sorted_seq, item)) – O(n)
|
🎨 Визуализация сложных данных
|
Грамматика графики в Python: как работать с plotnine
|
Грамматика графики (Grammar of Graphics) – это концепция, которая представляет собой структурированный подход к созданию статистических графиков и визуализаций данных. Основная идея заключается в том, что любой статистический график можно разложить на несколько независимых компонентов или составляющих: - Данные (Data) – исходный набор данных для визуализации.
- Отображение данных (Mapping) – соответствие между переменными в данных и визуальными элементами (осями, цветом, формой и т.д.).
- Геометрические объекты (Geometric Objects) – визуальное представление данных (точки, линии, прямоугольники и т.д).
- Статистические преобразования (Statistical Transformations) – операции над данными, такие как подсчет, агрегирование, сглаживание и т.п.
- Шкалы (Scales) – управление диапазонами значений и преобразование к визуальным координатам.
- Координатная система (Coordinate System) – определяет тип графика (декартовы, полярные координаты и т.д.).
- Элементы оформления (Annotations) – заголовки, подписи, легенды и прочие дополнительные аннотации.
Грамматика графики позволяет декларативно описывать график как сочетание этих независимых компонентов. Это облегчает понимание, модификацию и воспроизведение сложных визуализаций. Библиотека plotnine (основанная на ggplot2 для R) реализуют эту концепцию, предоставляя высокоуровневый интерфейс для создания статистических графиков из компонентов грамматики. Основные приемы визуализации данных с помощью plotnine и новые возможности библиотеки изложены в этой публикации. |
Библиотека plotnine воспроизводит всю основную функциональность ggplot2 в Python |
Проект Python Graph Gallery – это обширная коллекция эффектных графиков, которые чаще всего используются в профессиональном анализе данных. Здесь собраны сотни примеров визуализации данных – вместе с кодом. В разделе Tools подробно разбираются основные приемы работы с самыми популярными инструментами – Matplotlib, Seaborn, Plotly, Pandas и Plotnine. |
Пример визуализации данных о возрасте космонавтов |
Исследователи из Пекинского университета начали разработку опенсорсного аналога Sora, и уже добились заметного успеха – демо-версия Open Sora Plan доступна на Hugging Face. К работе над проектом приглашаются все желающие. |
Пакет django-pony-express призван упростить и структурировать процесс отправки писем в веб-приложениях на Django. Основные возможности: - Структура на основе классов. Подобно Django-представлениям на основе классов, pony-express позволяет создавать классы для различных типов писем. Это способствует четкой организации кода и повторному использованию логики.
- Эффективное использование принципов ООП. Классы писем могут наследоваться и переопределять методы, как и любые другие классы Python, предоставляя гибкость и возможность повторного использования кода.
- Единый шаблон для HTML и текстового форматов. Не нужно дублировать шаблоны для HTML и текстовых версий писем – Pony Express генерирует обе версии из одного шаблона.
- Модульное тестирование. Предоставляется тестовая инфраструктура для модульного тестирования классов писем.
- Доступ к тестовому инбоксу через Django queryset. Отправленные в ходе тестов письма доступны для проверки через Django queryset – это сильно облегчает процесс отладки.
|
На этом все, до встречи через неделю! |
|
|
Вы получили это письмо, потому что подписались на нашу рассылку. Если вы больше не хотите получать наши письма, нажмите здесь.
|
|
|
|