Библиотека питониста | Python, Django, Flask
40.5K subscribers
2.78K photos
75 videos
51 files
4.36K links
Все самое полезное для питониста в одном канале.

Список наших каналов: https://t.iss.one/proglibrary/9197

Курс по ML: https://cl

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv
РКН: https://gosuslugi.ru/snet/67b885cbd501cf3b2cdb5b36
Download Telegram
💼 Топ-вакансий для питонистов за неделю

ML/CV python backend разработчик —‍ от 350 000 до 400 000 ₽, удалёнка

Python Backend Developer —‍ от 250 000 ₽, удалёнка

Middle Python Developer —‍ от 2800 до 3200 $, удалёнка

Senior System Engineer (Python / Golang) —‍ от 400 000 до 460 000 ₽, удалёнка

Python разработчик —‍ от 300 000 ₽, удалёнка

➡️ Еще больше топовых вакансий — в нашем канале Python jobs

Библиотека питониста
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1😁1
🛠 How to: писать проще в Python без лишних классов

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

Вот как можно упростить ваш код:

🔹 Нужно просто хранить данные?

Используйте @dataclass или namedtuple:
from dataclasses import dataclass

@dataclass
class Point:
x: int
y: int

p = Point(1, 2)


🔹 Нужна утилита без состояния?

Пишите обычные функции:
def add(a, b):
return a + b


🔹 Хотите сгруппировать настройки или константы?

Создайте модуль:
# config.py
HOST = 'localhost'
PORT = 8080'


# main.py
import config
print(config.HOST)


🔹 Храните простое состояние?

Используйте списки или словари:
inventory = []
inventory.append('apple')


🔹 Простая трансформация данных?

Пишите через list comprehension или lambda:
result = [x * 2 for x in data]


Или:
transform = lambda data: [x * 2 for x in data]


🔹 Работаете с конфигами или сериализацией?

Воспользуйтесь стандартными модулями:
import json

config = {'host': 'localhost', 'port': 8080}
with open('config.json', 'w') as f:
json.dump(config, f)


▶️ Когда классы действительно полезны:
• если есть состояние + поведение
• если нужен шаблон для объектов
• если проект требует наследования или композиции

▶️ Пишите просто. Пишите по-Питони.
Класс — это не всегда решение.
Иногда достаточно функции, модуля или словаря.

▶️ Подробнее можно узнать в статье: https://clc.to/onD8-Q

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍4😁2💯2🤔1🌚1
🤔 Зачем вообще понимать, как работает ML?

Сейчас многие просто запускают модельку в sklearn — и радуются точности 0.92.

Вроде всё работает… но почему?
А когда сломается — что делать?


Машинное обучение — это система, которую можно понять.

Если знаешь, что делает градиентный спуск, зачем нужен бустинг и как дерево принимает решения — ты не просто «запускаешь», ты управляешь моделью.

👉 Мы сделали курс, чтобы в это было реально въехать:

— без сложных формул;
— с интуитивными объяснениями;
— от простого к сложному.

Если хочешь перейти от «гуглю код» к «понимаю, как это работает» — ты по адресу!

Стартуем в сентябре — бронируй место на курсе уже сейчас
3👍1
🚚 Delivery Manager: кто это и зачем он нужен в IT

В каждой IT-компании есть деливери-менеджеры, но чётко объяснить, чем они занимаются, может далеко не каждый. Они не совсем проектные менеджеры, не совсем тимлиды — но без них всё разваливается.

➡️ Это не стартовая позиция, но очень востребованная — особенно в зрелых компаниях и крупных проектах.

🔗 Читайте статью, чтобы понять, стоит ли вам двигаться в эту сторону: https://proglib.io/sh/9qwbeKQ0dV

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
🎯 Команда дня: вложенные функции в Python

Python позволяет определять функции *внутри* других. Зачем? Чтобы передавать поведение, создавать замыкания, делать partial-функции и, конечно, писать декораторы.

Вложенные функции = функции внутри функций
def greet_me(name="друг"):
def greet():
print("Привет,", name)
greet()


🚩 Внутренняя greet() знает о name, потому что захватила его из внешней функции. Это и есть замыкание — функция «помнит» переменные.

Функция возвращает функцию
def greet_me(name):
def greet():
print("Привет,", name)
return greet

greet_ivan = greet_me("Иван")
greet_ivan() # Привет, Иван


🚩 greet_ivan — это не результат, а сама функция! Причём она «помнит», что name = Иван. Удобно, если нужно повторно вызывать с теми же параметрами.

Создаём функции с «настроенным поведением»
def make_adder(x):
def add(y):
return x + y
return add

add5 = make_adder(5)
add5(10) # ➡️ 15


🚩 Мы создали «фабрику» функций. add5 — это функция, которая всегда добавляет 5. Можно так же легко сделать add10, add100 и т.д.

Своя версия partial-функции
def partial(func, *args, **kwargs):
def new_func(*a, **kw):
return func(*args, *a, **kwargs, **kw)
return new_func

bin_to_int = partial(int, base=2)
bin_to_int("1101") # ➡️ 13


🚩 Мы зафиксировали аргумент base=2 и получили удобную функцию bin_to_int(), которая всегда читает двоичное число. Быстро и понятно!

Декораторы работают точно так же
def log(func):
def wrapper(*args, **kwargs):
print("Вызов", args, kwargs)
result = func(*args, **kwargs)
print("Результат", result)
return result
return wrapper


🚩 log — это функция, которая возвращает функцию-обёртку. Эта обёртка добавляет логирование вокруг вызова оригинальной функции. Никакой магии — только вложенные функции и замыкание.

Что нужно запомнить:
✔️ Вложенные функции — удобный способ передавать и «запоминать» контекст
✔️ Замыкание — функция несёт с собой значения переменных
✔️ partial и декораторы — мощные приёмы, основанные на этих идеях

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍5🔥3😁3
✔️ Чек-лист: как отлаживать ошибки в Python

1️⃣ Чтение Traceback’ов (сообщений об ошибках)

*️⃣ Читайте каждую строку сообщения об ошибке внимательно.
*️⃣ Определите файл и строку, в которой возникла ошибка.
*️⃣Обратите внимание на тип ошибки (NameError, TypeError, SyntaxError и т. д.).
*️⃣ Ознакомьтесь с пояснением ошибки — оно поможет понять, что пошло не так.

2️⃣ Использование print() для отладки

*️⃣ Добавляйте print() до и после участков, вызывающих сомнения.
*️⃣ Используйте f-строки для наглядности: print(f"{переменная = }").
*️⃣ Следите за порядком выполнения кода и значениями переменных.
*️⃣ После устранения ошибки удаляйте print() или заменяйте на logging.

3️⃣ Использование breakpoints и отладчика

*️⃣ Устанавливайте точки останова в редакторе кода (например, VS Code, PyCharm).
*️⃣ Используйте встроенную функцию breakpoint() для остановки выполнения.
*️⃣ В режиме отладки применяйте команды:
n — выполнить следующую строку (next)
s — перейти внутрь функции (step)
c — продолжить выполнение (continue)
p переменная — вывести значение переменной

4️⃣ Отладка с помощью тестов

*️⃣ Пишите юнит-тесты для всех функций (с помощью unittest или pytest).
*️⃣ Тестируйте как корректные случаи, так и крайние (edge cases).
*️⃣ Используйте тесты для воспроизведения ошибок.
*️⃣ Запускайте тесты регулярно: python -m unittest или pytest.

5️⃣ Общий подход к отладке

*️⃣ Читайте полное сообщение об ошибке, а не только последнюю строку.
*️⃣ Изолируйте проблему — сократите код до минимального примера с ошибкой.
*️⃣ Проговаривайте код вслух или объясняйте его — это помогает найти ошибки.
*️⃣ Делайте частые коммиты, чтобы проще было вернуться к рабочей версии.

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84🔥3🤩2🥱1
🫣 Боитесь математики в ML?

Думаете, для этого нужно вспоминать университетские интегралы и решать сложные уравнения?

У нас хорошая новость: машинное обучение — это в первую очередь инженерная практика, а не математическая олимпиада. Здесь важнее понимать суть, а не выводить формулы.

Именно на таком подходе — через логику, интуицию и наглядные примеры — и построен наш курс «ML для старта в Data Science», где мы объясняем всё на пальцах, без боли и зубрёжки.

Регистрируйтесь, пока есть свободные места 😉
💬 Вопрос от подписчика: зачем вообще нужен uv

Один из наших подписчиков поделился мыслями после пары месяцев использования uv:
Вроде всё классно… но я всё ещё сомневался, зачем он мне лично.

В целом, инструмент делает именно то, что заявляет: ускоряет Python-проекты, улучшает стандартный tooling (установка пакетов, создание виртуалок и т.д.). Работает быстро и стабильно — не придраться.

Но! Как обычный пользователь Python-библиотек, он взаимодействует с uv всего 2–3 раза в месяц. Всё остальное время — старые добрые pip, venv и уже настроенные окружения.


И вот какие вопросы возникли:
🔘 Стоит ли удобство uv того, чтобы ставить ещё один инструмент?
🔘 Почему бы просто не остаться с pip и venv, пусть и чуть медленнее?
🔘 Может, я чего-то не понимаю?

А теперь к вам, сообщество:
Вы уже пробовали uv? Реально ли он экономит вам время? Или всё ещё кажется решением без боли, но и без особой необходимости?

Библиотека питониста #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
2😁2👍1🥱1
Proglib Academy — это место, где вы превращаете теорию в практику. Здесь ваши знания становятся проектами для портфолио, а вы — более уверенным специалистом.

Выберите курс, который поможет сделать следующий шаг ⬇️

🚀 Для тех, кто начинает путь в IT:

Основы IT для непрограммистов
Программирование на Python (обновлённый)
Frontend-разработчик с нуля: HTML, CSS, JavaScript

🧠 Для будущих и настоящих Data Scientist'ов:

ML для старта в Data Science (начинается в сентябре)
Базовые модели ML и приложения
Математика для Data Science
AI-агенты для DS-специалистов (скоро второй поток)

🛠️ Для опытных разработчиков, готовых к росту:

Алгоритмы и структуры данных
Архитектуры и шаблоны проектирования

Независимо от вашей цели, у нас есть курс, который поможет её достичь. Переходите в Proglib Academy, выбирайте свой путь и инвестируйте в навыки, которые всегда будут в цене!
🛠 Что посмотреть: как создать продвинутый MCP-сервер на Python

MCP-сервер — это лёгкий, независимый сервер на Python, который обрабатывает запросы через собственный протокол (Message Control Protocol).

💡 Без Flask, FastAPI и Django — только чистый сокет и логика.

Что в видео:
— Как работает MCP-протокол
— Обработка сообщений и структура сервера
— Авторизация через Stytch (не просто access token)
— Хранение пользовательских заметок
— Как адаптировать под свой проект (API, чат, внутренний сервис)

🔗 Смотреть туториал: https://clc.to/UcCggQ

Библиотека питониста #буст
7👍7🔥2
👉 Мифы и сказки вокруг производительности Python

🔎 Миф 1: «Python не медленный» (а то мы не знали)

Многие считают, что Python достаточно быстр, ведь это язык-«клей», где для тяжёлых вычислений используют GPU или вызывают C/C++/Rust-библиотеки. Но на самом деле, для множества задач Python всё же медленен.

🔎 Миф 2: «Если медленно, перепиши горячие участки на C/C++/Rust»

Это действительно часто помогает — оптимизировать 20% кода, где происходит 80% работы (принцип Парето). Однако Amdahl's law говорит, что ускорение одной части программы в итоге упирается в остальной код. После ускорения «горячих» мест, всё остальное начинает доминировать по времени исполнения.

🔎 Миф 3: «Python медленный, потому что он интерпретируемый»

Интерпретация даёт некоторое замедление, но гораздо больше времени уходит на выполнение динамической семантики Python: поиск типов, вызовы методов вроде __getattribute__(), упаковку и распаковку значений, выделение памяти и т.д. Это не зависит от того, интерпретируется код или компилируется.

🔎 Статическая типизация и JIT — помогают, но не решают всё

Python набирает популярность с аннотациями типов, но статическая типизация не проверяется во время выполнения. Например:
def add(x: int, y: int) -> int:
return x + y

print(add('hello ', 'world')) # type: ignore


Здесь добавление строк работает, но не соответствует типам. Значит, оптимизации на основе типов невозможны в чистом Python.

JIT-компиляторы (например, в PyPy) действительно могут ускорить Python, но они усложняют предсказуемость производительности и требуют понимания, как именно JIT оптимизирует код. Иногда оптимизации «ломаются» при изменении программы, даже если код кажется простым.

🔎 Абстракции в Python — не бесплатны

Рассмотрим простой алгоритм:
def algo(points: list[tuple[float, float]]):
res = 0
for x, y in points:
res += x**2 * y + 10
return res


Если вынести вычисление в отдельную функцию:
def fn(x, y):
return x**2 * y + 10

def algo(points: list[tuple[float, float]]):
res = 0
for x, y in points:
res += fn(x, y)
return res


То производительность падает из-за накладных расходов на вызовы функций. Если вместо кортежей использовать @dataclass:
from dataclasses import dataclass

@dataclass
class Point:
x: float
y: float

def fn(p: Point):
return p.x**2 * p.y + 10

def algo(points: list[Point]):
res = 0
for p in points:
res += fn(p)
return res


Скорость падает ещё больше, потому что добавляется обращение к атрибутам объектов и накладные расходы, связанные с объектной моделью.

🔎 Кэш и память — главный узкий профиль

Основная проблема Python — не вычисления, а память. Современные процессоры быстро выполняют операции, но доступ к памяти (особенно к ОЗУ) намного медленнее.

Python-программы часто имеют плохую кэш-локалити из-за разброса объектов в памяти:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

p = [Person('Alice', 16), Person('Bob', 21)]


В памяти объекты Person и их атрибуты могут быть разбросаны, что приводит к множеству переходов по указателям и к частым кеш-промахам.

Это проблема, которую невозможно решить только компиляцией или JIT, не изменяя семантику языка.

🔗 Если интересно, почему Python медленный, посмотрите подробный доклад: https://clc.to/YWmMIA

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍95🔥1😁1
Холивар: запускать все тесты — или только нужные

Вопрос для питонистов: что лучше — полный прогон тестов при каждом пуше или выборочный запуск только нужных?

⚡️ Сторонники выборочного запуска говорят:
— «Мы изменили одну функцию в utils.py — зачем нам прогонять тесты на API, авторизацию и экспорт в Excel?»
— CI отрабатывает за 5 минут, а не за 40
— Меньше простаивания разработчиков в ожидании билдов
— Логи чище, меньше случайных падений

🐢 Сторонники полного прогона отвечают:
— «Вчера просто поправили формат даты в utils.py, и тихо умер отчёт в аналитике — в тестах API это бы поймали»
— Легче отлавливать неожиданные регрессии
— Нет сюрпризов после релиза
— CI — это страховка, а не ускоритель

Вот, например, кто-то предложил использовать Snob — инструмент, который экономит время и деньги, анализируя граф зависимостей Python-проекта и выбирая для запуска только те тесты, которые реально затронуты изменениями в коде.

📌 Что делает Snob:
— Отбрасывает ~99% тестов, не связанных с изменениями
— Ускоряет разработку и снижает стоимость CI
— Работает на основе статических импортов, а не предсказаний
— Не заменяет полный регрессионный прогон, но сильно помогает при разработке больших кодовых баз

⚠️ Чего Snob не делает:
— Не ловит динамические импорты, сайд-эффекты во время выполнения и другие неявные зависимости

💬 А теперь вопрос — вы бы доверили такому инструменту свой пайплайн, или всё-таки только полный прогон даёт спокойствие?

Библиотека питониста #междусобойчик
7👍1