Библиотека питониста | Python, Django, Flask
41.1K subscribers
2.65K photos
73 videos
51 files
4.23K links
Все самое полезное для питониста в одном канале.

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

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

По рекламе: @proglib_adv
РКН: https://gosuslugi.ru/snet/67b885cbd501cf3b2cdb5b36
Download Telegram
🧱⛏️ Чекни свой крафт: 8 признаков, что разработчик слишком залип в Minecraft

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

😎 Пройди наш тест и узнай, насколько глубоко ты провалился в пиксельную кроличью нору!

👉 Пройти тест

Библиотека питониста
Please open Telegram to view this post
VIEW IN TELEGRAM
Питонисты!

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

➡️Поддержать канал: https://t.me/boost/pyproglib
Please open Telegram to view this post
VIEW IN TELEGRAM
😺🐙🧼 Сам себе GitHub: как работать с чистым Git-репозиторием

Git — мощная система контроля версий, которую обычно используют через платформы вроде GitHub и GitLab. Однако Git сам по себе не требует веб-интерфейсов и облачных сервисов. Многие разработчики предпочитают работать с чистым Git-репозиторием, размещенным на собственном сервере.

➡️ В этой статье мы рассмотрим, почему это удобно, и как эффективно отправлять патчи в проекты, использующие этот подход.

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
😇 Ошибка дня: UnboundLocalError

Сегодня разбираем одну из тех ошибок в Python, которая выглядит загадочно, но легко объяснима, если знать одну тонкость.

💥 Что произошло

1️⃣ Вы определили функцию-декоратор, всё работает:
def trigger(*fns):
def decorator(fn):
fn._next = fns

def _wrapper():
fn()
for f in fn._next:
f()
return _wrapper
return decorator


2️⃣ Затем использовали:
def step_2():
print("step 2")

def step_3():
print("step 3")

@trigger(step_2, step_3)
def step_1():
print("step 1")

step_1()

Вывод:
step 1
step 2
step 3


3️⃣ Но потом — решили переименовать переменную в цикле, чтобы она называлась так же, как и fn снаружи:
def _wrapper():
fn()
for fn in fn._next: # ❗️ shadowing
fn()


4️⃣ Результат:
UnboundLocalError: cannot access local variable 'fn' where it is not associated with a value


Почему так

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

➡️ В примере выше: переменная fn переопределяется в цикле, а значит, Python считает, что она локальная для всей _wrapper(). Поэтому вызов fn() выше в коде — обращение к переменной, которой ещё нет, отсюда и UnboundLocalError.

На заметку:
➡️ Вложенные функции и декораторы — зона риска для shadowing
➡️ Если вы хотите использовать переменную из внешнего скоупа — не переопределяйте её имя внутри тела функции
➡️ Такие тонкости особенно актуальны при рефакторинге

Как исправить

Просто не переименовывайте переменную в fn повторно. Назовите её f, next_fn, step, callback — что угодно:
for step in fn._next:
step()


💬 Вопрос к вам: какие ошибки Python вам кажутся самыми «обидными», но по факту — обучающими?

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
📢 Какой рабочий сетап круче?

💻 Выбирайте свой вариант и делитесь в комментариях, как организовали свой рабочий уголок.

А то, может, там уже три монитора, как у хакера из фильмов, или ноутбук на коленках, как у студента перед дедлайном?

❤️ — 1
👍 — 2
⚡️ — 3
👏 — 4
🔥 — 5
🎉 — 6
😁 — 7
😍 — 8
🤩 — 9

Библиотека питониста #развлекалово
Please open Telegram to view this post
VIEW IN TELEGRAM
✔️ Чек-лист: как исправить SyntaxError в Python

1⃣ Проверяем базовый синтаксис

🟢 Убедитесь, что после if, for, while, def, class есть двоеточие :
if x > 0: вместо if x > 0


🟢 Проверьте парность скобок: (), [], {}
print("Hi" → print("Hi")


🟢 Используйте правильные кавычки для строк: 'text' или "text", а не text

2⃣ Следим за ключевыми словами и операторами

🟢 Не используйте зарезервированные слова (class, return, import) как имена переменных
class = 5 → ошибка, используйте class_name


🟢Проверьте правильность операторов: == для сравнения, = для присваивания
if x = 5 → if x == 5


🟢 Не путайте : и = в словарях: {"key": "value"}, а не {"key" = "value"}

3⃣ Контролируем отступы и пробелы

🟢 Убедитесь, что отступы в блоках кода (после if, def) одинаковы (4 пробела или табуляция)
def func():
print("Ok") # Не смешивайте пробелы и табы


🟢 Избегайте лишних пробелов в именах: def my_func(), а не def my _func()

4⃣ Исправляем ошибки копирования и REPL

🟢 При копировании из REPL убирайте >>> и ....
 >>> print("Hi") → print("Hi")


🟢 Добавляйте пустую строку между блоками в REPL
  def greet():
print("Hi")

greet() # Нужен перенос строки перед вызовом


5⃣ Учитываем версию Python

🟢 Используйте Python 3.10+ для более понятных сообщений об ошибках
  — Python 3.9: SyntaxError: invalid syntax
— Python 3.10: SyntaxError: '(' was never closed


🟢 Проверьте код на современной версии, если ошибка непонятна

6⃣ Диагностика и отладка

🟢 Читайте номер строки в ошибке, но проверяйте код выше — проблема может быть раньше

🟢 Упрощайте код, убирая части, чтобы найти источник ошибки

🟢 Используйте редактор с подсветкой синтаксиса для поиска скобок и опечаток

Полезные инструменты:
— Линтеры: flake8, pylint — находят ошибки до запуска
— Редакторы: VS Code с плагином Python, PyCharm

Совет

Если видите SyntaxError: invalid syntax, начните с проверки скобок, двоеточий и отступов — это решает 80% случаев.

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🤨 ТОП-7 стран для айтишников в 2025 году

Как найти страну, где работа в IT приносит не только достойный доход, но и удовольствие от жизни? В этой статье Ксения Кравченко собрала семь лучших направлений для релокации айтишников в 2025 году — от стабильных хабов до быстрорастущих техноцентров.

Что в статье:

➡️ Средняя зарплата IT-специалистов в каждой стране

➡️ Уровень налогов и наличие льгот для техсектора

➡️ Иммиграционные программы и условия въезда

➡️ Развитость IT-экосистемы и перспективы в индустрии

➡️ Плюсы и минусы жизни в каждом регионе

Если вы задумываетесь о переезде или просто хотите знать, где IT-навыки особенно ценны — самое время заглянуть в подборку 🔗
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
🙈 Что скрывает дисперсия: разгадка секрета точных ML-моделей

Представьте, что вы строите модель, которая прекрасно работает на тренировочных данных, но стоит подать ей новые примеры... и всё рушится. Знакомо? За этим почти всегда скрывается неправильное обращение с дисперсией.

🧐 Но что, если есть простая формула, способная:

• Мгновенно определить, насколько «разбросаны» ваши данные

• Значительно улучшить точность ваших ML-моделей

• Помочь обнаружить аномалии, которые вы раньше не замечали

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

Хотите узнать, как находить идеальный баланс в своих моделях, причем тут Random Forest и много другого о Data Science?

➡️Тогда смотрите бесплатный вебинар от Proglib: 🙈 Что скрывает дисперсия: разгадка секрета точных ML-моделей

Представьте, что вы строите модель, которая прекрасно работает на тренировочных данных, но стоит подать ей новые примеры... и всё рушится. Знакомо? За этим почти всегда скрывается неправильное обращение с дисперсией.

🧐 Но что, если есть простая формула, способная:

• Мгновенно определить, насколько «разбросаны» ваши данные

• Значительно улучшить точность ваших ML-моделей

• Помочь обнаружить аномалии, которые вы раньше не замечали

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

Хотите узнать, как находить идеальный баланс в своих моделях, причем тут Random Forest и много другого о Data Science?

➡️Тогда смотрите бесплатный вебинар от Proglib: https://proglib.io/w/4fdac1b7
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Что посмотреть: Python 3.14 и грядущие изменения

На днях вышел релиз alpha 7, а после следующего релиза (beta 1) новых фич уже не добавят. Самое время изучить, что нового принесёт Python 3.14 — и в формате видео это ещё удобнее

Темы видео:
🔎 График выхода и ключевые даты
🔎 PEP 765, PEP 648, PEP 758 — что они изменят
🔎 Улучшения производительности: JIT, NOGIL и хвостовая оптимизация
🔎 Практичные новшества и мелкие обновления

🔗 Смотреть видео: https://clc.to/7Z5daA

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🖼 ТОП-5 структур данных для обработки изображений

Хотите разобраться, как обрабатывать изображения в компьютерном зрении или графике?

Всё начинается с правильных структур данных. Они помогают хранить и анализировать пиксели, их связи и расположение.

👉 В этой статье — подборка топ решений и советы, как их использовать.

Библиотека питониста
Please open Telegram to view this post
VIEW IN TELEGRAM
🆕 PEP 750 принят: шаблонные строки в Python

Этот PEP вводит в Python шаблонные строки (template strings) для гибкой работы со строками.

🟠Шаблонные строки — это обобщение f-строк: вместо префикса f используется префикс t.

🟠 В отличие от f-строк, которые сразу превращаются в обычную строку (str), t-строки возвращают объект нового типа — Template:
template: Template = t"Hello {name}"


Что это даёт

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

🚩 Зачем это нужно:
— Возможность проверок безопасности (например, защита от SQL-инъекций)
— Удобство при создании веб-шаблонов
— Поддержка DSL (предметно-ориентированных языков) внутри Python
— Больше контроля над строками при их формировании

Пример:
template = t"Привет, {username}!"
print(template.fields) # ['username']
print(template.source) # 'Привет, {username}!'


Позже можно безопасно рендерить шаблон:
result = template.render(username="Алиса")


🔗 Официальный текст PEP: https://clc.to/yZ9NhA

Библиотека питониста #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👏 Набор настоящего питониста

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

Впрочем, в наборе питониста всегда есть место для обновлений Python.

💭 Какое обновление Python сильнее всего повлияло на ваш стиль кода?

❤️ f-строки — читаемо и быстро
👍 @property — красиво и по-взрослому
🔥 Переключение зависимостей — как глоток свежего воздуха
😁 Shared vs independent списки — багов наловил, но стал умнее
🤔 Свой вариант — пишите в комментариях

Библиотека питониста #развлекалово
Please open Telegram to view this post
VIEW IN TELEGRAM
😈 PEP’ы, которые бесят (или радуют) питонистов

Каждый раз, когда появляется новый PEP, в воздухе пахнет жареными клавишами.

Поговорим о классике — тех, что навсегда в сердцах (или в чёрном списке):

1⃣ PEP 8 — стиль, который «все соблюдают, но не до конца»

Отступы, длина строк, имена переменных...
Каждый линтер и IDE пытается напомнить: «Вы не следуете PEP8!»
Но разве 81 символ в длину — это преступление?
➡️ Главный источник пассивной агрессии в код-ревью.

2⃣ PEP 484 — Типизация, которая «не настоящая, но работает»

Hello, type hints...
Python стал делать вид, что он статически типизирован.
А mypy стал делать вид, что всё это имеет смысл.
➡️ Кто-то говорит «будущее», кто-то — «шум и пыль».

3⃣ PEP 572 — Моржик `:=`, который разделил сообщество

Пример:
while (line := file.readline()):
print(line)


Одни: «Удобно! Элегантно!»
Другие: «Python теперь как Perl. Брр.»
➡️ Мемов стало больше. Это уже плюс.

🪅 Бонус-треки:
PEP 517/518 — «Половина питонистов не знает, как работает их pyproject.toml»
PEP 505 (предложение) — `None-aware operators` — ждали, надеялись, не приняли
PEP 701 — f-строки 2.0! Вставляйте хоть выражения, хоть тернарные операторы

🫠 Есть ли у вас любимый (или самый раздражающий) PEP?
Как считаете, нужны ли PEP'ы в таком количестве, или Python уже слишком зарегулирован?

Библиотека питониста #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👋 Всем привет!

Мы ищем участников для интервью на тему «Обучение навыкам в IT»!

✔️ Кто нам нужен?
— Вы разработчик или дата сайентист, прокачивающий свои навыки. Или хотите войти в IT.

✔️ Что нужно сделать?
— Заполните гуглоформу по теме (займет не более 10 минут).
— Если нас заинтересует ваш опыт, мы пригласим поучаствовать в небольшом интервью по Zoom (не больше 45 минут).
— Вознаграждение: 1500 рублей на карту за участие + уникальный шанс пообщаться с нашим CEO!

🧑‍💻 Откликнуться.
Please open Telegram to view this post
VIEW IN TELEGRAM
🐍 Python новости

🚀 Релизы и инструменты:
PEP 750 принят — шаблонные строки в Python
Python 3.14 и грядущие изменения — фичи альфы и планы до фризов
httpdbg— удобная отладка HTTP-запросов в Python
runvenv — shebang + venv: запускаем Python-скрипты из нужного venv
NVIDIA добавила нативную поддержку Python в CUDA

🧪 Глубже в Python:
uv + PEP 723 — простой деплой Python-скриптов
Tail-calling: новый интерпретатор CPython — что меняется под капотом
Контроль времени в тестах— freeze, mock, Clock
Гайд по overload — пишем один код для разных бэкендов
Тонкости логгирования в Python — кратко и по делу
Создаем ретро-оконный менеджер на Python — стиль Windows 3.x

💭 Истории, подходы, мышление:
Как я стал core-разработчиком Python в 19 лет
Путь воина: Python + Go через Цеттелькастен — кому подходит
Антипаттерны: ломкие функции в Python — как не писать хрупкий и нестабильный код

🌐 Django и веб:
Django 5.2: что нового — поддержка PEP 649, улучшения ORM и не только
User onboarding в Django — как улучшить первый опыт пользователя
Отслеживание изменений моделей с django-pghistory — как логировать историю данных

💻 Экосистема:
Режим агента в VS Code — теперь для всех

🎮 Fun/DIY:
3D-игра на Python своими руками — от идеи до рабочего примера

Библиотека питониста #свежак
🔖 Это база: секрет Python, который ускорит ваш код в миллионы раз

lru_cache — декоратор для кеширования результатов функций. Повторные вызовы с теми же аргументами не вычисляются заново — это ускоряет код в разы.

Пример:
from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(30)) # Выводит: 832040
print(fibonacci.cache_info()) # Статистика кеша


С lru_cache результаты сохраняются в кеше и повторно используются, что ускоряет выполнение.

🚩 Возможные применения:
— Рекурсивные функции
— Повторяющиеся запросы к базе данных
— Повторные API-запросы

Пример:
import requests
from functools import lru_cache

@lru_cache(maxsize=32)
def get_weather(city):
response = requests.get(f"https://api.weather.com/data?city={city}")
return response.json()

print(get_weather("New York")) # Первый вызов
print(get_weather("New York")) # Кешированный ответ


🚩 Как работает lru_cache

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

Настройка размера кеша

Параметр maxsize позволяет регулировать размер кеша:
— None — неограниченный размер кеша
— Число — ограничение на количество записей в кеше

Пример:
@lru_cache(maxsize=256)
def expensive_computation(x, y):
return x * x + y * y


Обработка изменяемых аргументов

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

Пример:
@lru_cache(maxsize=32)
def process_data(data_tuple):
return sum(data_tuple)

data = [1, 2, 3, 4]
print(process_data(tuple(data))) # Преобразуем список в кортеж


Очистка кеша

Для этого можно использовать метод cache_clear().

Пример:
expensive_computation.cache_clear()


🚩 Преимущества:
— Ускорение работы функций
— Легкость внедрения с @lru_cache
— Поддерживает статистику

🚩 Недостатки:
— Возможен рост потребления памяти при maxsize=None
— Поддерживаются только хешируемые аргументы

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
📱 Шесть релизов Python за один день: вот это весна 2025-го

Во вторник, 8 апреля 2025 года, Python-команда выдала настоящий релизный фейерверк — сразу шесть новых версий Python. Это, без сомнений, один из самых насыщенных дней в истории языка.

Python 3.14.0a7 — финальный альфа-релиз
— Дата релиза: 8 апреля 2025
— Следующий шаг: 3.14.0 beta1 (6 мая 2025)
— Статус: последний альфа-релиз — до фич-фриза осталось меньше месяца

Ключевые изменения в 3.14:
PEP 649: отложенная (lazy) обработка аннотаций
PEP 741: новый C API для конфигурации интерпретатора
PEP 758: поддержка except и except* без скобок
PEP 761: вместо PGP теперь используется Sigstore для верификации релизов
PEP 765: запрет return/break/continue при выходе из finally
PEP 768: безопасный интерфейс для внешних дебаггеров CPython
Новый тип интерпретатора с улучшенной производительностью (опционально)
Поддержка UUID версий 6–8 + ускоренная генерация 3–5 и 8 (до 40% быстрее)
Улучшенные сообщения об ошибках
Удаления и депрекейты в C API и Python-коде

Python 3.13.3
— 320 исправлений, улучшений сборки и документации
— Актуальная стабильная ветка с новыми возможностями и оптимизациями

Python 3.12.10 — последний багфикс-релиз
— Более 230 исправлений и улучшений
— С этого момента — только security-патчи

🪅 Обновления безопасности для:

Python 3.11.12
Deadlock fix
— Обновления expat, уязвимость imaplib, urlparse, и др.

Python 3.10.17
— Обновления libexpat, CVE-2025-0938, imaplib OOM

Python 3.9.22
— Последние security-фиксы для старой, но ещё поддерживаемой ветки

💡 Призыв к разработчикам:
— Обновите свои проекты, если вы на 3.9–3.13
— Протестируйте Python 3.14 на совместимость
— До фич-фриза осталось < 4 недель — добавляйте свои предложения

Библиотека питониста #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
🙂 Раскрываем секрет собственных векторов: математическое оружие на собеседовании

Что объединяет успешный собес и продвинутый анализ данных? Оба требуют способности выделять главное из информационного шума!

В мире данных этот суперскилл называется методом главных компонент (PCA) — это как рентген для ваших данных, который мгновенно показывает всю суть, отбрасывая неважные детали.

Например, мы проанализировали 453 акции компаний из списка S&P 500 и выяснили, что всего одна главная компонента объясняет 38% всей динамики рынка. Как такое возможно?

😘 Расскажем на воркшопе «Математика машинного обучения на практике» 21 апреля!

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

Стоимость: 3990 ₽

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

➡️ Забронировать место на воркшопе: https://proglib.io/w/6f0e5775
Please open Telegram to view this post
VIEW IN TELEGRAM
⌨️ Топ-вакансий для питонистов за неделю

Senior Python-разработчик — от 250 000 до 300 000 ₽, гибрид (Москва)

Python разработчик (Middle+/Senior) — от 3000 до 4000 $, удалённо (Бали)

Tech lead Python developer — от 400 000 до 600 000 ₽, удалённо (Бали)

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

Python-разработчик (Junior/Middle) — от 1 500 до 3 100 $, удалённо

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

Библиотека питониста
Please open Telegram to view this post
VIEW IN TELEGRAM
🚩 Шпаргалка: методы словаря в Python

Подготовили для вас краткую, но ёмкую шпаргалку по основным методам работы со словарями. Систематизировано и понятно.

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM