🐼 Что нового в pandas 3.0 — наш детальный взгляд
Мы уже делились, что вышел pandas 3.0. Сегодня чуть более детально о том, что реально изменилось:
📍Наконец-то убили SettingWithCopyWarning
Тот самый «адский ворнинг» при работе со срезами DataFrame — всё.
В pandas 3 полностью внедрён Copy-on-Write:
— фильтрации больше не копируют данные сразу
— копия создаётся только при мутации
— .copy() после каждого шага больше не нужен
— предупреждение исчезло
👍 Это одно из самых важных UX-улучшений за годы.
📍Новый синтаксис выражений — pandas.col()
Method chaining в pandas всегда выглядел громоздко из-за lambda:
Теперь можно писать как в Polars / PySpark:
📍UDF больше не приговор к «очень медленно»
.apply() раньше = боль и падение производительности.
В pandas 3 появился интерфейс execution engines.
Теперь UDF можно JIT-компилировать:
Код остаётся понятным Python и производительность может быть выше векторизованного варианта.
📍Строки и Arrow
Полного «Arrow внутри pandas» не случилось.
Вместо этого:
— новый dtype: str
— под капотом может быть Arrow или legacy, в зависимости от окружения
— больше совместимости, меньше боли при апгрейде
— но всё ещё 3 разных способа хранить строки
🔗 Подробно с примерами в статье
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Мы уже делились, что вышел pandas 3.0. Сегодня чуть более детально о том, что реально изменилось:
📍Наконец-то убили SettingWithCopyWarning
Тот самый «адский ворнинг» при работе со срезами DataFrame — всё.
В pandas 3 полностью внедрён Copy-on-Write:
— фильтрации больше не копируют данные сразу
— копия создаётся только при мутации
— .copy() после каждого шага больше не нужен
— предупреждение исчезло
📍Новый синтаксис выражений — pandas.col()
Method chaining в pandas всегда выглядел громоздко из-за lambda:
.assign(max_people=lambda df: df.max_people + df.max_children)
Теперь можно писать как в Polars / PySpark:
.assign(max_people=pandas.col("max_people") + pandas.col("max_children"))
📍UDF больше не приговор к «очень медленно»
.apply() раньше = боль и падение производительности.
В pandas 3 появился интерфейс execution engines.
Теперь UDF можно JIT-компилировать:
df.apply(func, axis=1, engine=bodo.jit())
Код остаётся понятным Python и производительность может быть выше векторизованного варианта.
📍Строки и Arrow
Полного «Arrow внутри pandas» не случилось.
Вместо этого:
— новый dtype: str
— под капотом может быть Arrow или legacy, в зависимости от окружения
— больше совместимости, меньше боли при апгрейде
— но всё ещё 3 разных способа хранить строки
🔗 Подробно с примерами в статье
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Python для собеседований. Вопрос: В чём разница между *args и **kwargs?
Когда мы пишем функции в Python, чаще всего знаем, сколько аргументов они будут принимать. Но иногда это неизвестно заранее. Именно для таких случаев существуют
Чтобы их понять, сначала разберёмся с двумя базовыми типами аргументов.
(a) Позиционные аргументы (Positional Arguments)
Это аргументы, которые передаются в функцию в определённом порядке:
первый аргумент →
второй аргумент →
Если перепутать порядок:
Python всё равно выполнит вызов, но:
(b) Именованные аргументы (Keyword Arguments)
Здесь мы явно указываем, какому параметру что соответствует. Порядок уже не важен:
Так код читается лучше и снижает риск ошибок.
🔛 Различия
Используется, когда количество входных значений заранее неизвестно.
Ключи — названия, значения — данные.
🔛 Использование вместе:
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Когда мы пишем функции в Python, чаще всего знаем, сколько аргументов они будут принимать. Но иногда это неизвестно заранее. Именно для таких случаев существуют
*args и **kwargs.Чтобы их понять, сначала разберёмся с двумя базовыми типами аргументов.
(a) Позиционные аргументы (Positional Arguments)
Это аргументы, которые передаются в функцию в определённом порядке:
def greet(name, age):
print(f"Hello {name}, you are {age} years old")
greet('Shiva Shankar', 30)
greet('Narayanan', 32)
первый аргумент →
nameвторой аргумент →
ageЕсли перепутать порядок:
greet(31, 'Lakshmi')
Python всё равно выполнит вызов, но:
name = 31age = 'Lakshmi', что логически неверно.(b) Именованные аргументы (Keyword Arguments)
Здесь мы явно указываем, какому параметру что соответствует. Порядок уже не важен:
greet(name='Ganesh', age=25)
greet(age=21, name='Karthikeya')
Так код читается лучше и снижает риск ошибок.
*args позволяет функции принимать любое количество позиционных аргументов. Внутри функции они собираются в кортеж:
def calculate_total(*prices):
total = 0
for i, price in enumerate(prices, 1):
print(f"Item {i}: {price}")
total += price
print(f"Total: {round(total, 2)}")
calculate_total(10.5, 20, 5.75)
prices → это кортеж: (10.5, 20, 5.75)Используется, когда количество входных значений заранее неизвестно.
**kwargs позволяет принимать любое количество именованных аргументов. Внутри функции они собираются в словарь:
def show_order(**kwargs):
total = 0
for i, (item, price) in enumerate(kwargs.items(), 1):
print(f"{i}. {item}: {price}")
total += price
print(f"Total: {round(total, 2)}")
show_order(apple=2.5, milk=1.8, bread=2.2)
kwargs:
{'apple': 2.5, 'milk': 1.8, 'bread': 2.2}
Ключи — названия, значения — данные.
*args + **kwargs
def shopping_cart(*items, **prices):
print("Items:")
for i, item in enumerate(items, 1):
print(f"{i}. {item}")
print("\nPrices:")
total = 0
for i, (item, price) in enumerate(prices.items(), 1):
print(f"{i}. {item}: {price}")
total += price
print(f"\nTotal bill: {round(total, 2)}")
shopping_cart(
"Shoes", "T-shirt",
Shoes=50, Tshirt=20
)
items → позиционные данные (что купили)prices → именованные данные (цены)📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤8🔥3
🎉 Python 1.0 был выпущен ровно 32 года назад!
📅 Точная дата выхода версии 1.0 зафиксирована в архивных анонсах — январь 1994 (релиз 1.0.0 датирован перепиской от 27 января).
В Python 1.0 появились основы, которые мы до сих пор используем — включая механизмы функционального программирования вроде lambda, map, filter и reduce.
Уже тогда язык отличался простотой и читаемостью, что помогло ему быстро найти аудиторию среди разработчиков.
🥳 Так, 27 января 1994 → 27 января 2026 — ровно 32 года Python в строю!
Поздравляем? А сколько вы уже вместе с Python?
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
📅 Точная дата выхода версии 1.0 зафиксирована в архивных анонсах — январь 1994 (релиз 1.0.0 датирован перепиской от 27 января).
В Python 1.0 появились основы, которые мы до сих пор используем — включая механизмы функционального программирования вроде lambda, map, filter и reduce.
Уже тогда язык отличался простотой и читаемостью, что помогло ему быстро найти аудиторию среди разработчиков.
🥳 Так, 27 января 1994 → 27 января 2026 — ровно 32 года Python в строю!
Поздравляем? А сколько вы уже вместе с Python?
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉26👍6🤩1
Python — база для ИИ-агентов. Пора выходить за рамки FastAPI и Pandas
Агентские фреймворки вроде
Курс «Углубленные AI-агенты» научит вас строить такие системы с нуля.
Ваш стек на курсе:
—
— глубокая работа с
— создание кастомных
— внедрение RAG-пайплайнов;
— финальный проект для портфолио за 60 дней.
Обучение уже началось, успейте занять место.
🚀 Записаться на основной курс
Если сомневаетесь — просто посмотрите вводное занятие.
Агентские фреймворки вроде
LangGraph и CrewAI меняют правила игры. Теперь ваша задача не просто написать скрипт, а создать среду, где агенты на Python сами управляют логикой и кодом.Курс «Углубленные AI-агенты» научит вас строить такие системы с нуля.
Ваш стек на курсе:
—
Python как дирижер мультиагентных систем;— глубокая работа с
CrewAI, LangGraph и AutoGen;— создание кастомных
Tools для выполнения действий в коде;— внедрение RAG-пайплайнов;
— финальный проект для портфолио за 60 дней.
Обучение уже началось, успейте занять место.
🚀 Записаться на основной курс
Если сомневаетесь — просто посмотрите вводное занятие.
❤2
🚨 Баг на ровном месте: как
Недавно наткнулись на очень показательный баг в Python-проекте с распределёнными процессами.
Один алгоритм считает числовые пороги (`float`) и передаёт их другому процессу в виде JSON. Модели общие, всё на Pydantic — красота, типизация, валидация.
И вдруг второй процесс падает с ошибкой:
>
Хотя первый процесс отправлял… float.
🧩 Что произошло
В одном из порогов оказалось значение NaN:
🧩 Почему
Потому что:
— В IEEE 754 у float есть спецзначение
— В JSON стандарте — нет представления для NaN
— Разрешены только: число, строка, объект, массив,
Поэтому сериализатор делает единственное, что может — превращает
А дальше:
И Pydantic получает:
Но поле объявлено как
То есть:
Сериализация и десериализация не являются обратными операциями.
🧩 Почему это особенно коварно
И у него особая логика:
А вот
🧩 Как это чинить
1. Можно сказать Pydantic сериализовать
Работает идеально внутри Python.
Но многие парсеры (JS, БД, API) такой JSON не примут, и формально это уже не RFC-совместимый JSON.
2. Сделать поле
JSON становится валидным. Но теперь теряется типовая строгость и нужно везде помнить, что
3. Кастомный тип (самый аккуратный)
Сказать модели явно:
>
Теперь:
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
NaN превратился в None и сломал PydanticНедавно наткнулись на очень показательный баг в Python-проекте с распределёнными процессами.
Один алгоритм считает числовые пороги (`float`) и передаёт их другому процессу в виде JSON. Модели общие, всё на Pydantic — красота, типизация, валидация.
И вдруг второй процесс падает с ошибкой:
>
Input should be a valid number, input_value=NoneХотя первый процесс отправлял… float.
🧩 Что произошло
В одном из порогов оказалось значение NaN:
thr = Thresholds(high=float('nan'), low=0.0)
json_str = thr.model_dump_json()
print(json_str)
# {"high": null, "low": 0.0}
🧩 Почему
NaN стал nullПотому что:
— В IEEE 754 у float есть спецзначение
NaN— В JSON стандарте — нет представления для NaN
— Разрешены только: число, строка, объект, массив,
true, false, nullПоэтому сериализатор делает единственное, что может — превращает
NaN → null.А дальше:
JSON null → Python None
И Pydantic получает:
high=None
Но поле объявлено как
float, а не float | None → валидация падает.То есть:
float('nan') → JSON null → Python None
Сериализация и десериализация не являются обратными операциями.
🧩 Почему это особенно коварно
NaN — валидный float. Его часто используют как “значение не определено”.И у него особая логика:
nan > 10 # False
nan < 10 # False
nan == 10 # False
А вот
None — это уже другой тип, и сравнения просто падают с TypeError. Семантика теряется.🧩 Как это чинить
1. Можно сказать Pydantic сериализовать
NaN как литерал:
{"high": NaN}
model_config = ConfigDict(ser_json_inf_nan='constants')
Работает идеально внутри Python.
Но многие парсеры (JS, БД, API) такой JSON не примут, и формально это уже не RFC-совместимый JSON.
2. Сделать поле
float | None
high: float | None
JSON становится валидным. Но теперь теряется типовая строгость и нужно везде помнить, что
None на самом деле значит NaN.3. Кастомный тип (самый аккуратный)
Сказать модели явно:
>
null в JSON — это NaN, а не None
FloatNaN = Annotated[
float,
PlainSerializer(lambda v: None if math.isnan(v) else v, when_used="json"),
BeforeValidator(lambda v: float("nan") if v is None else v),
]
Теперь:
NaN → null → NaN
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤6
🐍 Конец эпохи busy-polling в Python: subprocess больше не крутит цикл 15-летней давности
Мало кто задумывается, как Python ждёт завершения процессов. Но начиная с Python 3.3 (когда появился
То есть буквально:
С экспоненциальной паузой, да. Но всё равно это означало:
— постоянные пробуждения CPU
— лишние context switches
— задержку между реальным завершением процесса и моментом, когда Python это замечает
— плохую масштабируемость при большом числе процессов
И так жили около 15 лет.
Выяснилось, что современные POSIX-системы позволяют ждать завершения процесса событийно, без опроса:
🐧 Linux (5.3+)
Появился
Этот FD можно передать в
Ядро само разбудит процесс — никаких циклов, никакого sleep.
🍏 macOS / BSD
Тут есть
🪟 Windows
Тут всё и так было хорошо — используется
Что это даёт на практике
Тест: процесс ждёт сам себя 10 секунд.
До (busy-loop):
После (event-driven):
То есть вместо постоянного «проснулся → проверил → уснул» процесс просто спит в ядре, как при
Меньше CPU, меньше энергопотребление, лучше масштабируемость.
Где это теперь используется
Сначала решение появилось в psutil, а затем попало прямо в CPython subprocess.
Это редкий случай, когда оптимизация из сторонней библиотеки уходит в стандартную библиотеку Python.
Ирония в том, что 15 лет назад
Теперь всё наоборот.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Мало кто задумывается, как Python ждёт завершения процессов. Но начиная с Python 3.3 (когда появился
timeout в `Popen.wait()`), стандартная библиотека использовала… busy-loop polling.То есть буквально:
waitpid(WNOHANG) → sleep → check → sleep → check ...
С экспоненциальной паузой, да. Но всё равно это означало:
— постоянные пробуждения CPU
— лишние context switches
— задержку между реальным завершением процесса и моментом, когда Python это замечает
— плохую масштабируемость при большом числе процессов
И так жили около 15 лет.
Выяснилось, что современные POSIX-системы позволяют ждать завершения процесса событийно, без опроса:
🐧 Linux (5.3+)
Появился
pidfd_open(): он возвращает file descriptor, связанный с PID.Этот FD можно передать в
poll() и просто блокироваться, пока процесс не завершится.Ядро само разбудит процесс — никаких циклов, никакого sleep.
🍏 macOS / BSD
Тут есть
kqueue(), который умеет напрямую следить за PID и уведомлять о EXIT.🪟 Windows
Тут всё и так было хорошо — используется
WaitForSingleObject, то есть событийная модель была с самого начала.Что это даёт на практике
Тест: процесс ждёт сам себя 10 секунд.
До (busy-loop):
Voluntary context switches: 258
После (event-driven):
Voluntary context switches: 2
То есть вместо постоянного «проснулся → проверил → уснул» процесс просто спит в ядре, как при
time.sleep().Меньше CPU, меньше энергопотребление, лучше масштабируемость.
Где это теперь используется
Сначала решение появилось в psutil, а затем попало прямо в CPython subprocess.
Это редкий случай, когда оптимизация из сторонней библиотеки уходит в стандартную библиотеку Python.
Ирония в том, что 15 лет назад
psutil.wait() вдохновлялся реализацией subprocess.wait(timeout=...).Теперь всё наоборот.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁23🤩1
⚠️ В Python regex лучше использовать `\A...\z`, а не `^...$`
Есть подстава в стандартном модуле
Интуитивно кажется, что шаблон:
должен матчить только строку
Но нет. В Python он матчится и на:
То есть
✅ Правильнее для «строка целиком»
Использовать якоря начала/конца реальной строки:
Это гарантирует, что ни одного лишнего символа, даже
Раньше
Но теперь Python 3.14 добавил поддержку
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Есть подстава в стандартном модуле
re, о которой многие узнают слишком поздно.Интуитивно кажется, что шаблон:
^Hello$должен матчить только строку
"Hello".Но нет. В Python он матчится и на:
"Hello\n"То есть
$ считает позицию перед переводом строки концом строки. И если ты валидируешь ввод, заголовки, токены, протоколы и т.д. — можно случайно пропустить лишний \n.✅ Правильнее для «строка целиком»
Использовать якоря начала/конца реальной строки:
\A — начало всей строки\z — конец всей строки (без поблажек на newline)
\AHello\z
Это гарантирует, что ни одного лишнего символа, даже
\n, нет.Раньше
\z был нормальной практикой почти везде… кроме Python (и JS).Но теперь Python 3.14 добавил поддержку
\z — и он становится универсальным и безопасным вариантом.📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1🤔1
Python-код, который пишет сам себя: LangGraph
Забудьте про бесконечные
Это переход от скриптинга к архитектуре:
— TypedDict State: строгая типизация памяти агента;
— Graph Nodes: каждая функция — узел графа;
— Conditional Edges: переходы, зависящие от решения LLM.
Курс уже стартовал. Успейте освоить главный фреймворк 2026 года.
Записаться на курс
Смотреть первую лекцию бесплатно
Забудьте про бесконечные
while-циклы и костыли с try-except при работе с LLM. LangGraph вводит нативный для Python способ управления поведением агента.Это переход от скриптинга к архитектуре:
— TypedDict State: строгая типизация памяти агента;
— Graph Nodes: каждая функция — узел графа;
— Conditional Edges: переходы, зависящие от решения LLM.
Курс уже стартовал. Успейте освоить главный фреймворк 2026 года.
Записаться на курс
Смотреть первую лекцию бесплатно
😁3
❓ Python vs Java — что происходит под капотом
Коротко о том, как код реально исполняется 👇
➕ Python (CPython)
Python-код (`.py`) автоматически компилируется в байткод. Он может кэшироваться в
Дальше импорт-система подтягивает зависимости, а Python Virtual Machine интерпретирует байткод построчно.
Итог — высокая гибкость и простота, но цена за это — скорость.
➕ Java (JVM)
Java-код (`.java`) заранее компилируется в байткод (`.class`). JVM загружает его, проверяет, а затем исполняет: сначала через интерпретатор, а «горячие» участки кода JIT-компилятор переводит в нативный машинный код.
Поэтому Java со временем становится быстрее и стабильнее по производительности.
👨💻 А что ближе в реальных проектах — гибкость Python или стабильная скорость Java?
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Коротко о том, как код реально исполняется 👇
Python-код (`.py`) автоматически компилируется в байткод. Он может кэшироваться в
.pyc, чтобы ускорить повторные запуски. Дальше импорт-система подтягивает зависимости, а Python Virtual Machine интерпретирует байткод построчно.
Итог — высокая гибкость и простота, но цена за это — скорость.
Java-код (`.java`) заранее компилируется в байткод (`.class`). JVM загружает его, проверяет, а затем исполняет: сначала через интерпретатор, а «горячие» участки кода JIT-компилятор переводит в нативный машинный код.
Поэтому Java со временем становится быстрее и стабильнее по производительности.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2
Небольшой тул на Python, который делает стильные постеры карт по городу и стране.
Вот быстрое how-to:
Если использовать uv (рекомендуется) — он сам поднимет виртуальное окружение и поставит зависимости:
uv run ./create_map_poster.py --city "Paris" --country "France"
Либо сначала зафиксировать зависимости:
uv sync --locked
uv run ./create_map_poster.py --city "Paris" --country "France"
Классический вариант через pip + venv:
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
Запуск:
python create_map_poster.py --city <city> --country <country>
Обязательные параметры всего два:
--city — город--country — странаМинимальный пример:
--city "Paris" --country "France"На входе название города → на выходе аккуратный постер карты.
👌 Отлично подходит для принтов, обложек и просто визуального фана.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4
LangChain → LangGraph: новый стек для Python-разработчика
Если вы всё ещё пишете линейные цепочки на
Вместо хардкода
—
—
—
Это превращает скрипт в надёжную систему. На курсе учим проектировать такие архитектуры и деплоить их.
Записаться на курс
Разбор архитектуры и кода — в открытом доступе.
Смотрите вводный урок бесплатно.
Если вы всё ещё пишете линейные цепочки на
LangChain, вы отстали. Продакшн требует LangGraph — надстройки для создания агентов с циклами и сохранением состояния.Вместо хардкода
if/else вы описываете граф:—
State: контекст, который передаётся между узлами;—
Nodes: функции Python, выполняющие работу;—
Edges: логика переходов (включая условные).Это превращает скрипт в надёжную систему. На курсе учим проектировать такие архитектуры и деплоить их.
Записаться на курс
Разбор архитектуры и кода — в открытом доступе.
Смотрите вводный урок бесплатно.
😁5
PyCharm теперь с поддержкой Google Colab
IDE всё плотнее дружит с облаком: можно работать с Colab-проектами из привычного интерфейса.
Интроспекция в Python на реальных примерах
Как код узнаёт сам о себе: атрибуты, объекты, метаданные и прочая магия, на которой держатся ORM, фреймворки и половина «умных» библиотек.
threading vs multiprocessing vs asyncio
Классический треугольник страданий разобран без мифов.
Аннотации и модуль typing
Систематизация всего, что произошло с типами в Python за последние годы.
Дескрипторы — скрытый механизм Python
Тема не из лёгких, но именно здесь Python превращается из «простого» в «элегантно хитрый».
Готовые промпты для программистов
Подборка шаблонов для работы с ИИ в задачах разработки.
💼 Вакансии
Python-разработчик — от 200 000 до 300 000 ₽/мес на руки, офис/гибрид (Москва)
Старший разработчик сервисов данных (Python), офис/гибрид (Москва)
Senior Backend-разработчик, удалёнка
📍 Навигация: Вакансии • Задачи • Собесы
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1
🔥 Топовые GitHub-репозитории по Python, которые реально помогут
Сохраняй — это готовый roadmap из практики, алгоритмов и best practices.
1️⃣ Коллекция полезных Python-скриптов, туториалов и разных полезностей — как большой набор инструментов под рукой.
2️⃣ Огромный curated-список лучших Python-фреймворков, библиотек, софта и ресурсов. Почти вся экосистема в одном месте.
3️⃣ Та же awesome-подборка, но со статистикой stars и forks — помогает быстро понять, что реально популярно и живо.
4️⃣ Все алгоритмы на Python — идеально для изучения структур данных и подготовки к техсобесам.
5️⃣ Список туториалов, где учат создавать приложения с нуля — полноценная практика, а не разрозненные куски кода.
6️⃣ Python-скрипты по темам: примеры кода, объяснения, кейсы использования и ссылки на дополнительные материалы. Отличный справочник.
7️⃣ 100+ задач и челленджей по Python — чтобы закрепить знания через практику.
8️⃣ Хэндбук по best practices: установка, настройка и повседневная работа с Python без боли.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Сохраняй — это готовый roadmap из практики, алгоритмов и best practices.
1️⃣ Коллекция полезных Python-скриптов, туториалов и разных полезностей — как большой набор инструментов под рукой.
2️⃣ Огромный curated-список лучших Python-фреймворков, библиотек, софта и ресурсов. Почти вся экосистема в одном месте.
3️⃣ Та же awesome-подборка, но со статистикой stars и forks — помогает быстро понять, что реально популярно и живо.
4️⃣ Все алгоритмы на Python — идеально для изучения структур данных и подготовки к техсобесам.
5️⃣ Список туториалов, где учат создавать приложения с нуля — полноценная практика, а не разрозненные куски кода.
6️⃣ Python-скрипты по темам: примеры кода, объяснения, кейсы использования и ссылки на дополнительные материалы. Отличный справочник.
7️⃣ 100+ задач и челленджей по Python — чтобы закрепить знания через практику.
8️⃣ Хэндбук по best practices: установка, настройка и повседневная работа с Python без боли.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
🦆 NumPy с уточками: когда код превращается в игру
Если вы когда-нибудь пытались освоить NumPy, то знаете: поначалу удержать в голове логику работы с массивами бывает непросто. Документация полезна, но иногда хочется чего-то более наглядного.
Знакомьтесь с Numpy Ducky — проектом в духе знаменитого Flexbox Froggy.
Здесь вы учитесь работать с данными, помогая милым уточкам добраться до воды.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Если вы когда-нибудь пытались освоить NumPy, то знаете: поначалу удержать в голове логику работы с массивами бывает непросто. Документация полезна, но иногда хочется чего-то более наглядного.
Знакомьтесь с Numpy Ducky — проектом в духе знаменитого Flexbox Froggy.
Здесь вы учитесь работать с данными, помогая милым уточкам добраться до воды.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12😁5
Please open Telegram to view this post
VIEW IN TELEGRAM
😁27💯5👍2🤔2
🚀 Pillow стал быстрее: как профилировщик из Python 3.15 помог ускорить открытие изображений
При обычном
1. Вызывает
2. Импортирует плагины форматов (PNG, GIF, JPEG и др.)
3. Проверяет, подходит ли каждый плагин под файл
4. Если нет — вызывает
📦 Сейчас в Pillow 47 плагинов форматов.
Даже если ты открываешь один PNG, библиотека могла импортировать кучу ненужного кода.
Идея оптимизации -> вместо загрузки всех плагинов — сделать lazy loading по расширению файла.
👉 Сначала быстрый lookup:
Только если:
— нет расширения
— расширение неверное
→ тогда используется старый механизм с перебором.
⭐️ Улучшение войдёт в Pillow 12.2.0
🔗 Ссылка на материал с деталями реализации
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
При обычном
Image.open() Pillow:1. Вызывает
preinit()2. Импортирует плагины форматов (PNG, GIF, JPEG и др.)
3. Проверяет, подходит ли каждый плагин под файл
4. Если нет — вызывает
init() и грузит все остальные плагины📦 Сейчас в Pillow 47 плагинов форматов.
Даже если ты открываешь один PNG, библиотека могла импортировать кучу ненужного кода.
Идея оптимизации -> вместо загрузки всех плагинов — сделать lazy loading по расширению файла.
👉 Сначала быстрый lookup:
расширение файла → нужный плагинТолько если:
— нет расширения
— расширение неверное
→ тогда используется старый механизм с перебором.
⭐️ Улучшение войдёт в Pillow 12.2.0
🔗 Ссылка на материал с деталями реализации
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1🤩1
🛠 Шпаргалка: как проверить, запущен ли Python-скрипт с повышенными правами
Иногда скрипту нужны root (Linux/macOS) или admin (Windows) права. Если их нет — лучше сразу завершиться, а не падать позже на системных операциях.
🐧 Linux / macOS — проверка на root
В Unix-системах всё просто: UID = 0 → это root
📌 Использует встроенную функцию
🪟 Windows — проверка на администратора
В Windows нет UID 0, поэтому используем вызов системной функции через
📌 Вызывает Windows API:
🌍 Универсальная функция
Если нужен один метод под все ОС:
⚠️ В продакшене часто делают так:
Просто, быстро и спасает от странных ошибок дальше по коду.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Иногда скрипту нужны root (Linux/macOS) или admin (Windows) права. Если их нет — лучше сразу завершиться, а не падать позже на системных операциях.
🐧 Linux / macOS — проверка на root
В Unix-системах всё просто: UID = 0 → это root
import os
def is_root() -> bool:
"""True, если скрипт запущен с root-правами (Linux/macOS)."""
if os.name == "posix":
return os.getuid() == 0
return False
📌 Использует встроенную функцию
os.getuid().🪟 Windows — проверка на администратора
В Windows нет UID 0, поэтому используем вызов системной функции через
ctypes:
import ctypes
import os
def is_admin() -> bool:
"""True, если скрипт запущен с правами администратора (Windows)."""
if os.name == "nt":
return ctypes.windll.shell32.IsUserAnAdmin() != 0
return False
📌 Вызывает Windows API:
IsUserAnAdmin.🌍 Универсальная функция
Если нужен один метод под все ОС:
import os
import ctypes
def has_elevated_privileges() -> bool:
if os.name == "posix":
return os.getuid() == 0
elif os.name == "nt":
return ctypes.windll.shell32.IsUserAnAdmin() != 0
return False
⚠️ В продакшене часто делают так:
if not has_elevated_privileges():
print("Требуются права администратора/root")
exit(1)
Просто, быстро и спасает от странных ошибок дальше по коду.
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤6🤔4
Шпаргалка.jpeg
222.5 KB
📌 Для новичков: короткая и понятная шпаргалка по Python 3, где есть весь базовый синтаксис, который нужен на старте
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔1🤩1
🐞 Как один тест помог найти баг в Django 6.0
Представьте: вы настроили идеальный конвейер. uv летает, Renovate тихонько обновляет зависимости в фоне, автомёрж работает, жизнь прекрасна.
💥 И тут прилетает Django 6.0. Один тест из всех падает.
Тест проверял ссылку с мульти-значениями в query-параметрах: /?content_type=1&content_type=2
Оказалось, что в Django 6.0 вместо этого стало рендериться: /?content_type=2 — выживало только последнее значение.
😡 Ребята хотели как лучше. В новой версии Django тег {% querystring %} научился принимать несколько позиционных аргументов. В ходе рефакторинга разработчики начали итерироваться по QueryDict.items(). Проблема в том, что .items() у QueryDict возвращает только последнее значение для каждого ключа.
Автор этой истории, мог бы просто ругаться на сырой релиз. Но его спас «правильно ленивый» тест, написанный ещё во времена Django 4.2.
Самое интересное здесь не сам баг, а то, как он был пойман:
1️⃣ Тест не вызывал метод модели напрямую, а проверял итоговый HTML через BeautifulSoup.
2️⃣ Когда-то в проекте был кастомный метод для формирования URL, который позже заменили на стандартный тег Django. Тест при этом не меняли — и он продолжил работать, проверяя именно то, что видит пользователь.
3️⃣ Если бы тест проверял только внутреннюю логику метода, он бы никогда не узнал, что обновление библиотеки сломало отображение на фронтенде.
💡 Выводы для нас:
➡️ Автоматизируйте апдейты: инструменты вроде Renovate превращают обновление в поток мелких правок, а не в «десантную операцию» раз в полгода.
➡️ Пишите «эмпатичные» тесты: тесты должны жить дольше, чем код, который они проверяют. Хороший тест фокусируется на поведении системы, а не на том, как вы назвали переменную.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
Представьте: вы настроили идеальный конвейер. uv летает, Renovate тихонько обновляет зависимости в фоне, автомёрж работает, жизнь прекрасна.
Тест проверял ссылку с мульти-значениями в query-параметрах: /?content_type=1&content_type=2
Оказалось, что в Django 6.0 вместо этого стало рендериться: /?content_type=2 — выживало только последнее значение.
Автор этой истории, мог бы просто ругаться на сырой релиз. Но его спас «правильно ленивый» тест, написанный ещё во времена Django 4.2.
Самое интересное здесь не сам баг, а то, как он был пойман:
1️⃣ Тест не вызывал метод модели напрямую, а проверял итоговый HTML через BeautifulSoup.
2️⃣ Когда-то в проекте был кастомный метод для формирования URL, который позже заменили на стандартный тег Django. Тест при этом не меняли — и он продолжил работать, проверяя именно то, что видит пользователь.
3️⃣ Если бы тест проверял только внутреннюю логику метода, он бы никогда не узнал, что обновление библиотеки сломало отображение на фронтенде.
💡 Выводы для нас:
📍 Навигация: Вакансии • Задачи • Собесы
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3
🐍 Вышли Python 3.14.3 и 3.13.12
Это уже третий технический релиз в ветке 3.14. Внутри — почти 300 исправлений багов и доработок.
Но если вы пропустили старт 3.14, напомню, почему эта серия — большой шаг вперед:
📌 Free-threaded Python: Теперь «многопоточность без GIL» (Global Interpreter Lock) официально поддерживается. Это историческое событие для производительности.
📌 t-strings (PEP 750): Помните f-строки? Теперь появились t-строки для кастомной обработки строк.
📌 Zstandard в «коробке»: В стандартную библиотеку добавили модуль
📌 Улучшенный C API и JIT: Официальные сборки для Windows и macOS теперь включают экспериментальный JIT-компилятор.
А что с 3.13.12?
Это двенадцатое (!) техническое обновление ветки 3.13. Около 250 исправлений. Эта ветка сейчас считается «рабочей лошадкой» для тех, кому важна стабильность, но хочется использовать современные фичи (например, улучшенный REPL или официальную поддержку Android-сборок).
⚠️ Важный нюанс для Windows
Команда Python постепенно меняет привычный инсталлятор на новый Install Manager (можно взять в Windows Store). Старый добрый
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#свежак
Это уже третий технический релиз в ветке 3.14. Внутри — почти 300 исправлений багов и доработок.
Но если вы пропустили старт 3.14, напомню, почему эта серия — большой шаг вперед:
📌 Free-threaded Python: Теперь «многопоточность без GIL» (Global Interpreter Lock) официально поддерживается. Это историческое событие для производительности.
📌 t-strings (PEP 750): Помните f-строки? Теперь появились t-строки для кастомной обработки строк.
📌 Zstandard в «коробке»: В стандартную библиотеку добавили модуль
compression.zstd. Больше никаких лишних зависимостей для быстрой компрессии.📌 Улучшенный C API и JIT: Официальные сборки для Windows и macOS теперь включают экспериментальный JIT-компилятор.
А что с 3.13.12?
Это двенадцатое (!) техническое обновление ветки 3.13. Около 250 исправлений. Эта ветка сейчас считается «рабочей лошадкой» для тех, кому важна стабильность, но хочется использовать современные фичи (например, улучшенный REPL или официальную поддержку Android-сборок).
⚠️ Важный нюанс для Windows
Команда Python постепенно меняет привычный инсталлятор на новый Install Manager (можно взять в Windows Store). Старый добрый
.exe пока останется с нами в версиях 3.14 и 3.15, но пора потихоньку привыкать к новому инструменту.📍 Навигация: Вакансии • Задачи • Собесы
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤5🎉2