🚚 Delivery Manager: кто это и зачем он нужен в IT
В каждой IT-компании есть деливери-менеджеры, но чётко объяснить, чем они занимаются, может далеко не каждый. Они не совсем проектные менеджеры, не совсем тимлиды — но без них всё разваливается.
➡️ Это не стартовая позиция, но очень востребованная — особенно в зрелых компаниях и крупных проектах.
🔗 Читайте статью, чтобы понять, стоит ли вам двигаться в эту сторону: https://proglib.io/sh/9qwbeKQ0dV
Библиотека питониста #буст
В каждой IT-компании есть деливери-менеджеры, но чётко объяснить, чем они занимаются, может далеко не каждый. Они не совсем проектные менеджеры, не совсем тимлиды — но без них всё разваливается.
Библиотека питониста #буст
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-функции и, конечно, писать декораторы.
✅ Вложенные функции = функции внутри функций
🚩 Внутренняя
✅ Функция возвращает функцию
🚩
✅ Создаём функции с «настроенным поведением»
🚩 Мы создали «фабрику» функций.
✅ Своя версия partial-функции
🚩 Мы зафиксировали аргумент
✅ Декораторы работают точно так же
🚩
Что нужно запомнить:
✔️ Вложенные функции — удобный способ передавать и «запоминать» контекст
✔️ Замыкание — функция несёт с собой значения переменных
✔️ partial и декораторы — мощные приёмы, основанные на этих идеях
Библиотека питониста #буст
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
и т.д.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
— это функция, которая возвращает функцию-обёртку. Эта обёртка добавляет логирование вокруг вызова оригинальной функции. Никакой магии — только вложенные функции и замыкание.Что нужно запомнить:
Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍5🔥3😁3
NameError
, TypeError
, SyntaxError
и т. д.).print()
до и после участков, вызывающих сомнения.print(f"{переменная = }")
.print()
или заменяйте на logging
.breakpoint()
для остановки выполнения.n
— выполнить следующую строку (next)s
— перейти внутрь функции (step)c
— продолжить выполнение (continue)p переменная
— вывести значение переменнойunittest
или pytest
).python -m unittest
или pytest
.Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4🔥3🤩2
🫣 Боитесь математики в ML?
Думаете, для этого нужно вспоминать университетские интегралы и решать сложные уравнения?
У нас хорошая новость: машинное обучение — это в первую очередь инженерная практика, а не математическая олимпиада. Здесь важнее понимать суть, а не выводить формулы.
Именно на таком подходе — через логику, интуицию и наглядные примеры — и построен наш курс «ML для старта в Data Science», где мы объясняем всё на пальцах, без боли и зубрёжки.
Регистрируйтесь, пока есть свободные места 😉
Думаете, для этого нужно вспоминать университетские интегралы и решать сложные уравнения?
У нас хорошая новость: машинное обучение — это в первую очередь инженерная практика, а не математическая олимпиада. Здесь важнее понимать суть, а не выводить формулы.
Именно на таком подходе — через логику, интуицию и наглядные примеры — и построен наш курс «ML для старта в Data Science», где мы объясняем всё на пальцах, без боли и зубрёжки.
Регистрируйтесь, пока есть свободные места 😉
Один из наших подписчиков поделился мыслями после пары месяцев использования uv:
Вроде всё классно… но я всё ещё сомневался, зачем он мне лично.
В целом, инструмент делает именно то, что заявляет: ускоряет Python-проекты, улучшает стандартный tooling (установка пакетов, создание виртуалок и т.д.). Работает быстро и стабильно — не придраться.
Но! Как обычный пользователь Python-библиотек, он взаимодействует с uv всего 2–3 раза в месяц. Всё остальное время — старые добрые pip, venv и уже настроенные окружения.
И вот какие вопросы возникли:
А теперь к вам, сообщество:
Вы уже пробовали uv? Реально ли он экономит вам время? Или всё ещё кажется решением без боли, но и без особой необходимости?
Библиотека питониста #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2😁2👍1
Proglib Academy — это место, где вы превращаете теорию в практику. Здесь ваши знания становятся проектами для портфолио, а вы — более уверенным специалистом.
Выберите курс, который поможет сделать следующий шаг ⬇️
🚀 Для тех, кто начинает путь в IT:
— Основы IT для непрограммистов
— Программирование на Python (обновлённый)
— Frontend-разработчик с нуля: HTML, CSS, JavaScript
🧠 Для будущих и настоящих Data Scientist'ов:
— ML для старта в Data Science (начинается в сентябре)
— Базовые модели ML и приложения
— Математика для Data Science
— AI-агенты для DS-специалистов (скоро второй поток)
🛠️ Для опытных разработчиков, готовых к росту:
— Алгоритмы и структуры данных
— Архитектуры и шаблоны проектирования
Независимо от вашей цели, у нас есть курс, который поможет её достичь. Переходите в 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
Библиотека питониста #буст
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: поиск типов, вызовы методов вроде
🔎 Статическая типизация и JIT — помогают, но не решают всё
Python набирает популярность с аннотациями типов, но статическая типизация не проверяется во время выполнения. Например:
Здесь добавление строк работает, но не соответствует типам. Значит, оптимизации на основе типов невозможны в чистом Python.
JIT-компиляторы (например, в PyPy) действительно могут ускорить Python, но они усложняют предсказуемость производительности и требуют понимания, как именно JIT оптимизирует код. Иногда оптимизации «ломаются» при изменении программы, даже если код кажется простым.
🔎 Абстракции в Python — не бесплатны
Рассмотрим простой алгоритм:
Если вынести вычисление в отдельную функцию:
То производительность падает из-за накладных расходов на вызовы функций. Если вместо кортежей использовать
Скорость падает ещё больше, потому что добавляется обращение к атрибутам объектов и накладные расходы, связанные с объектной моделью.
🔎 Кэш и память — главный узкий профиль
Основная проблема Python — не вычисления, а память. Современные процессоры быстро выполняют операции, но доступ к памяти (особенно к ОЗУ) намного медленнее.
Python-программы часто имеют плохую кэш-локалити из-за разброса объектов в памяти:
В памяти объекты
Это проблема, которую невозможно решить только компиляцией или JIT, не изменяя семантику языка.
🔗 Если интересно, почему Python медленный, посмотрите подробный доклад: https://clc.to/YWmMIA
Библиотека питониста #буст
Многие считают, что Python достаточно быстр, ведь это язык-«клей», где для тяжёлых вычислений используют GPU или вызывают C/C++/Rust-библиотеки. Но на самом деле, для множества задач Python всё же медленен.
Это действительно часто помогает — оптимизировать 20% кода, где происходит 80% работы (принцип Парето). Однако Amdahl's law говорит, что ускорение одной части программы в итоге упирается в остальной код. После ускорения «горячих» мест, всё остальное начинает доминировать по времени исполнения.
Интерпретация даёт некоторое замедление, но гораздо больше времени уходит на выполнение динамической семантики Python: поиск типов, вызовы методов вроде
__getattribute__()
, упаковку и распаковку значений, выделение памяти и т.д. Это не зависит от того, интерпретируется код или компилируется.Python набирает популярность с аннотациями типов, но статическая типизация не проверяется во время выполнения. Например:
def add(x: int, y: int) -> int:
return x + y
print(add('hello ', 'world')) # type: ignore
Здесь добавление строк работает, но не соответствует типам. Значит, оптимизации на основе типов невозможны в чистом Python.
JIT-компиляторы (например, в PyPy) действительно могут ускорить Python, но они усложняют предсказуемость производительности и требуют понимания, как именно JIT оптимизирует код. Иногда оптимизации «ломаются» при изменении программы, даже если код кажется простым.
Рассмотрим простой алгоритм:
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, не изменяя семантику языка.
Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥1😁1