Python обучающий
61.6K subscribers
818 photos
7 videos
404 links
Здесь есть всё, чтобы упростить изучение Python. Без воды и сложных терминов.

Сотрудничество: @bateman24, @justcage

Работаем с @Tgpodbor_official

Ссылка РНК: https://clck.ru/3Ghwjd
Download Telegram
⏱️ Измеряем время выполнения кода

Иногда нужно узнать, сколько времени занимает выполнение части кода — например, для оценки производительности. Новички могут не знать, как это сделать просто, но в Python есть встроенный модуль time.

С помощью time.time() можно получить текущую временную метку в секундах и легко измерить длительность выполнения любого блока.

🎯 Итог
Модуль time позволяет просто измерить время выполнения кода. Используйте time.time() до и после нужного блока и вычтите значения.
Получаем размер файла в байтах

Иногда нужно узнать, сколько весит файл — например, перед загрузкой или отправкой по сети. Новички могут не знать, как это сделать быстро и просто.

Python предоставляет удобный способ с помощью функции os.path.getsize().

🎯 Итог
Используйте os.path.getsize(path), чтобы легко получить размер файла в байтах. Удобно для логирования, проверки ограничений и статистики.
Получаем количество строк без загрузки всех данных

Новички часто загружают все строки из таблицы и считают их вручную, что может быть медленно и неэффективно. Гораздо лучше использовать встроенные возможности SQL для подсчёта строк прямо на стороне базы данных.

🎯 Итог
Вместо перебора всех записей в Python используй SQL-запрос COUNT(*). Это быстрый и надёжный способ узнать количество строк, особенно на больших таблицах.
Используем контекстный менеджер для безопасной работы с БД

Многие новички забывают закрывать соединения с базой данных, что может привести к утечкам ресурсов и блокировкам. Контекстный менеджер (with) упрощает работу с базой и автоматически закрывает соединение даже при ошибках.

🎯 Итог
Используй with при работе с базой данных — это гарантирует автоматическое закрытие соединения и делает код надёжнее и чище.
⚙️ Использование __slots__ для экономии памяти

По умолчанию Python хранит атрибуты объектов в словаре (__dict__), что удобно, но затратно по памяти. Если вы создаёте множество однотипных объектов, можно использовать slots, чтобы ограничить список допустимых атрибутов и сократить потребление памяти.
🧠 Умное логгирование исключений с exc_info=True

Когда ловишь исключение и хочешь залоггировать стек, многие забывают важный параметр.

🎯 Итог
Добавляй exc_info=True к логгированию исключений — получишь полный стек и не потеряешь важные детали при отладке.
🧠 Переопределение стандартного поведения функций через декоратор

Иногда хочется обернуть функцию, чтобы автоматически логировать её вызов или измерять время исполнения. Это удобно делать через декоратор.

🎯 Итог
Декораторы позволяют добавлять поведение к функциям, не изменяя их напрямую. Это мощный инструмент для логирования, кэширования, авторизации и прочих нужд.
🗂 Быстрое создание вложенных словарей с defaultdict

Если ты работаешь с вложенными структурами типа dict of dict, можно избавиться от лишних проверок на наличие ключей, используя collections.defaultdict.

📌 Это особенно удобно при подсчёте данных или построении динамических структур.

🎯 Итог
С помощью defaultdict можно упростить работу с вложенными словарями и избежать лишней проверки наличия ключей. Идеально подходит для счётчиков и агрегаций.
🧹 Удаление дубликатов при сохранении порядка

Обычно set() убирает дубликаты, но не сохраняет порядок.

dict.fromkeys() создаёт словарь, где ключи — элементы списка (они уникальны), и при этом сохраняет порядок добавления (с Python 3.7+).

🎯 Итог
Чтобы быстро убрать дубликаты и сохранить порядок, используй list(dict.fromkeys(...)). Эффективно и элегантно.
🧵 Распаковка словаря в аргументы функции

Иногда нужно передать значения из словаря в функцию — можно сделать это красиво и лаконично.

**data автоматически распакует ключи словаря как имена аргументов, а значения — как аргументы функции.

🎯 Итог
Когда у тебя есть словарь с нужными данными, не передавай каждый параметр вручную — просто используй **. Это сокращает код и повышает читаемость.
🪄 Получение имени текущей функции: inspect.currentframe()

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

🎯 Итог
С помощью inspect.currentframe().f_code.co_name можно динамически получить имя текущей функции. Отлично подходит для логирования и отладки.
🧵 🖇️ Объединение итерируемых объектов с itertools.chain

Когда у тебя есть несколько списков, кортежей или других итерируемых объектов, и нужно пройти по ним, будто это один большой список — chain делает это без создания промежуточных структур.

🎯 Итог
itertools.chain позволяет объединять итерируемые объекты "на лету" без лишнего потребления памяти. Полезно для работы с большими наборами данных.
📌 🔄 Клонирование объекта без copy через dataclasses.replace

Если вы работаете с dataclass и хотите создать копию объекта, изменив лишь пару полей, то можно использовать dataclasses.replace. Это удобнее и чище, чем вручную копировать все значения.

🎯 Итог
replace из dataclasses — быстрый способ клонировать объект с изменением выбранных атрибутов.
📌 🕵️‍♂️ Автоматический лог SQL-запросов в SQLAlchemy

При отладке удобно видеть, какие именно запросы уходит в базу. В SQLAlchemy это можно включить одной строкой при создании engine.

🎯 Итог
Флаг echo=True в create_engine позволяет мгновенно включить логирование SQL-запросов без дополнительных инструментов.
📌 Автоматическая метка времени при добавлении записей в БД

Чтобы не писать вручную дату создания и обновления записи, можно задать их прямо в модели SQLAlchemy.

🎯 Итог

Использование server_default=func.now() и onupdate=func.now() автоматизирует работу с датами в таблицах и избавляет от рутины.
Быстрое создание словаря с уникальными элементами

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

Используем dict comprehension вместе с set или enumerate для быстрой генерации словаря без лишних циклов.

🎯 Итог:
dict comprehension позволяет создавать словари в одну строку.
set помогает получить уникальные элементы.
enumerate позволяет учитывать порядок без дополнительных циклов.
🕵️‍♂️ Безопасное получение значения из словаря

При обращении к несуществующему ключу в словаре возникает KeyError. Чтобы этого избежать, часто пишут проверки if key in dict. Это громоздко.

Используй метод .get() с дефолтным значением. Он сразу вернёт либо значение по ключу, либо запасное, если ключа нет.
📌 📊 Удобное логирование запросов в консоль

Когда приложение растет, print() для отладки уже не подходит. Нам нужно полноценное логирование. В Python есть модуль logging, который позволяет красиво и гибко выводить информацию.

🎯 Итог

Заменяй print() на logging — получишь более наглядный и управляемый вывод.
📌 Быстрая проверка скорости выполнения кода

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

🎯 Итог

time.perf_counter() — простой способ измерять время выполнения кода с высокой точностью.
📌 🧵 Простое параллельное выполнение с ThreadPoolExecutor

Когда нужно ускорить выполнение нескольких независимых задач (например, загрузку файлов или запросы к API), можно использовать ThreadPoolExecutor из модуля concurrent.futures.

🎯 Итог
ThreadPoolExecutor — простой способ запускать функции в нескольких потоках и ускорять выполнение программы.