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

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

Работаем с @Tgpodbor_official

Ссылка РНК: https://clck.ru/3Ghwjd
Download Telegram
Получаем размер файла в байтах

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

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 — простой способ запускать функции в нескольких потоках и ускорять выполнение программы.
📌 Измеряем время выполнения кода с timeit

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

Модуль автоматически несколько раз выполняет код и выдаёт среднее время — удобно для сравнения разных реализаций.

🎯 Итог

timeit — быстрый способ измерить производительность и выбрать оптимальное решение.
📌 📝 Чтение больших файлов построчно

Если файл очень большой, не стоит загружать его целиком в память с помощью .read(). Эффективнее читать его по строкам через итерацию — это экономит ресурсы и работает быстрее.

🎯 Итог

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