Библиотека питониста | Python, Django, Flask
38.4K subscribers
3.14K photos
92 videos
56 files
4.83K links
Все самое полезное для питониста в одном канале.

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

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

По рекламе: @proglib_adv
РКН: https://gosuslugi.ru/snet/67b885cbd501cf3b2cdb5b36

#WXSSA
Download Telegram
🐍 Лексикографический порядок в Python

Почему в Python "apple" > "animal" возвращает True, а "Apple" < "apple" — тоже True? Всё дело в лексикографическом порядке.

Python не просто знает алфавит, он смотрит на Unicode-код каждого символа.

Сравнение идет посимвольно: первая пара, вторая и т.д.
Как только найдено различие — результат готов.
Если одна строка — префикс другой (напр. "cat" и `"catastrophe"`), то та, что короче, считается «меньшей».

Любая последовательность в Python (списки, кортежи, байтовые строки) сравнивается точно так же — индекс за индексом.

Пример с кортежами:


x = (45, 1, 13)
y = (45, 7, 4)
print(x < y) # True, потому что на индексе [1] единица меньше семерки.



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

Пример: Сортируем студентов по году выпуска, а затем по фамилии:

students = [
(1978, "Little"),
(1978, "Gonzalez"),
(1977, "Anders"),
]


Python сначала сравнит годы, а при равенстве — фамилии sorted_students = sorted(students)
Результат: Anders (1977), затем Gonzalez (1978), затем Little (1978)

Главные выводы:
1. Заглавные буквы в Unicode идут раньше строчных. Чтобы сортировка была честной, используйте .lower().
2. Вы не можете сравнить список и кортеж или строку и число — Python выдаст TypeError.
3. Если нужно отсортировать объекты по приоритету, создайте список кортежей (приоритет, объект).

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
⚡️ Google представил CEL-expr-python: мощный язык правил теперь нативно в Python

Google официально открыл исходный код CEL-expr-python — реализации Common Expression Language (CEL) для Python.

Если вы строите системы, где нужно безопасно вычислять условия «на лету» (например, правила доступа или валидацию данных), этот инструмент станет вашим фаворитом.

CEL (Common Expression Language) — это не-Тьюринг-полный язык выражений. Он специально создан простым, быстрым и, главное, безопасным. В отличие от обычного eval(), CEL гарантирует отсутствие побочных эффектов и всегда завершает выполнение.


💎 Вы можете позволить пользователям писать свои правила (фильтры, политики доступа) и не бояться, что они «положат» сервер бесконечным циклом или украдут данные.
💎 Библиотека написана как обертка над официальной реализацией на C++. Это значит, что вы получаете максимальную производительность и 100% совместимость со стандартами Google.
💎 Выражение, написанное для Python, будет работать точно так же в Go или C++ сервисах.

Где это использовать:
1. Написание гибких правил RBAC/ABAC.
2. Проверка сложных условий, которые приходят из конфигов или БД.
3. Если нужно дать пользователю возможность самому настраивать логику фильтрации в UI.

Пример кода:

from cel_expr_python import cel

# Создаем среду и объявляем переменные
env = cel.NewEnv(variables={"age": cel.Type.INT})

# Компилируем условие
expr = env.compile("age >= 18 ? 'Доступ разрешен' : 'Доступ запрещен'")

# Вычисляем
print(expr.eval(data={"age": 21})) # Доступ разрешен



🔗 Репозиторий

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
This media is not supported in your browser
VIEW IN TELEGRAM
👍 На курсе по контролируемой разработке AI-агентов мы будем разбирать ровно то, о чём говорит Владислав в голосовом, но уже в формате системной практики.

📅 Старт курса — 20 апреля.

Если хотите разобраться, как строить управляемые агентные системы:
➡️ Присоединяйтесь.

P.S. С первого занятия будет практика: код и разбор реальных ошибок, а не только теория.
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🚪 Knock-Knock: кто стучится в мой SSH

Проект Knock-Knock — это стильный и информативный дашборд-медоед (honeypot), который в реальном времени визуализирует атаки на ваш SSH-порт. Вместо скучных логов вы получаете живую ленту «стуков» со всеми подробностями.

Что можно увидеть на дашборде:
— Live Feed: поток попыток входа с указанием логина, пароля, IP и провайдера атакующего.
— 3D-Глобус: визуализация локации последнего «стука» и тепловая карта стран-агрессоров.
— Стена позора (Leaderboards): топы самых популярных паролей, логинов и наглых ISP.

Архитектура проекта проста и эффективна:
1. Honeypot (Python): слушает порт 22 и перехватывает данные.
2. Monitor: обогащает IP данными GeoIP (город, страна, провайдер).
3. Backend (FastAPI + Redis): хранит статистику в SQLite и транслирует живые события через WebSockets.
4. Frontend: адаптивный дашборд, который отлично работает и на десктопе, и на мобилках.

🔗 Демо в реальном времени: https://clc.to/P8C1mw
📂 GitHub проекта: https://clc.to/cjZX7Q

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
🔍 Сравнение тайп-чекеров: как они «видят» пустые списки

Когда вы пишете x = [], интерпретатор Python знает, что это список, но не знает, что в нем будет лежать. Разные тайп-чекеры решают эту загадку по-разному.

Стратегия 1: Все дозволено (`Any`)

Кто использует: Pyright, Pyre, Ty.
Как работает: Тайп-чекер просто помечает список как list[Any].

Плюс: Минимум ложных ошибок. Можно класть что угодно.
Минус: Нулевая безопасность. Ошибки (например, добавление списка вместо строки) проскочат в продакшен и вызовут краш в рантайме.

Стратегия 2: Анализ всех использований

Кто использует: Pytype.
Как работает: Чекер смотрит на весь код функции. Если вы добавили в список 1, а потом "foo", он выведет тип list[int | str].

Плюс: Максимально близко к поведению Python в рантайме.
Минус: Если ошибка закралась в начале функции, тайп-чекер может подсветить её только в самом конце (на `return`), что затрудняет отладку.

Стратегия 3: Вывод по первому использованию

Кто использует: Mypy, Pyrefly (по умолчанию).
Как работает: Тип фиксируется по первой операции append или add.

Пример: Если сначала добавили число, а потом пытаетесь добавить строку — вы получите ошибку сразу на строке с кодом.
Плюс: Ошибки подсвечиваются именно там, где они возникли. Это делает их максимально понятными и легко исправимыми.

🔗 Полный текст статьи


📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52
🐼 Pandas: 4 фатальные ошибки, которые делают 51% разработчиков

Даже в 2026 году Pandas остается главной «головной болью» Python-разработчика. С выходом версий 2.x и 3.x правила игры изменились.

1. Итерация по строкам

iterrows() — забудьте о нем. Он конвертирует каждую строку в pd.Series, создавая дикий overhead.
itertuples() — если цикл неизбежен, он быстрее в 10–100 раз.
Векторизация (np.where) — в 4000 раз быстрее.

> DS-совет: Если логика сложнее обычного сложения — используйте .apply(), но стремитесь к векторизации через NumPy.

2. Переименование

.rename(columns=...) — самый безопасный путь. Не ломается при изменении схемы.
.str.lower().str.replace() — лучший способ массово привести колонки к snake_case.
add_prefix() — спасение при сложных merge, когда нужно быстро разделить признаки из разных таблиц.

3. Война с NaN

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

Диагностика: df.isna().sum() — база.
ffill() / bfill() — критически важны для временных рядов (Time Series), чтобы не терять динамику.
fillna(median) — классика для ML-пайплайнов, но всегда проверяйте природу пропусков. Иногда dropna(subset=[...]) — единственный честный путь.

4. Фильтрация

Булевы маски: df[(df['A'] > 0) & (df['B'] < 1)] — классика. Важно: забудьте скобки — получите ошибку приоритета.
`.query()` — читается как SQL, поддерживает переменные через @. Идеально для длинных условий.
.loc[] — единственный верный способ, если нужно одновременно отфильтровать строки и выбрать колонки.

🔗 Ссылка на пост

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍5
📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих»

Мы написали и собрали для вас в одну подборку все 25 глав и 230 практических заданий!

🐍 Часть 1: Особенности, сферы применения, установка, онлайн IDE
🐍 Часть 2: Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
🐍 Часть 3: Типы данных: преобразование и базовые операции
🐍 Часть 4: Методы работы со строками
🐍 Часть 5: Методы работы со списками и списковыми включениями
🐍 Часть 6: Методы работы со словарями и генераторами словарей
🐍 Часть 7: Методы работы с кортежами
🐍 Часть 8: Методы работы со множествами
🐍 Часть 9: Особенности цикла for
🐍 Часть 10: Условный цикл while
🐍 Часть 11: Функции с позиционными и именованными аргументами
🐍 Часть 12: Анонимные функции
🐍 Часть 13: Рекурсивные функции
🐍 Часть 14: Функции высшего порядка, замыкания и декораторы
🐍 Часть 15: Методы работы с файлами и файловой системой
🐍 Часть 16: Регулярные выражения
🐍 Часть 17: Основы скрапинга и парсинга
🐍 Часть 18: Основы ООП – инкапсуляция и наследование
🐍 Часть 19: Основы ООП – абстракция и полиморфизм
🐍 Часть 20: Графический интерфейс на Tkinter
🐍 Часть 21: Основы разработки игр на Pygame
🐍 Часть 22: Основы работы с SQLite
🐍 Часть 23: Основы веб-разработки на Flask
🐍 Часть 24: Основы работы с NumPy
🐍 Часть 25: Основы анализа данных с Pandas
5👍2
🐍 Разминаем мозги: тест на знание основ Python

🐸 Библиотека питониста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73😁1
💥 Открытый вебинар | ИИ-агенты в продакшене: от хайпа к деньгам

Агенты уже везде. Но мало кто признаётся, сколько денег сжёг на бесконечных циклах, галлюцинациях в RAG и отсутствии мониторинга.

Полина Полунина, руководитель AI-направления Альфа-Банка, расскажет честно:

▪️ Чем агент отличается от «просто GPT с промптом» и когда бизнесу достаточно обычного LLM
▪️ 3 реальных кейса из корпоративной среды: что взлетело, а что нет
▪️ Live-демо работающего агента
▪️ ТОП-5 граблей, на которые наступают команды при внедрении

⏱️ 10 марта в 19:00 (МСК)

🎁 Участники получат промокод на скидку на самый полный курс по ИИ-агентам

👉 Регистрируйся
😄 Подборка Python-мемов

🤓 Листайте, улыбайтесь и узнавайте себя.
Если у вас есть свои любимые — делитесь в комментариях

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😁71
💡 Изобретаем свои Comprehensions в Python

Многие знают о list, set и dict comprehensions. Но что, если вам нужен tuple comprehension или frozenset comprehension? В синтаксисе Python их не существует, но мы можем их имитировать.

Главный секрет: Генераторные выражения

Генераторные выражения (generator expressions) — это «строительные блоки», которые позволяют создавать итерируемые объекты на лету без выделения памяти под весь список.

Как это работает:
Если передать генераторное выражение в функцию как единственный аргумент, лишние скобки можно опустить:


# Вместо этого:
all((n > 1 for n in numbers))
# Пишем так:
all(n > 1 for n in numbers)



🛠 Примеры «кастомных» включений

1. Tuple Comprehension

Формально его нет, но передача генератора в конструктор tuple() дает тот же результат:


>>> numbers = [2, 1, 3, 4, 7]
>>> tuple(n**2 for n in numbers)
(4, 1, 9, 16, 49)



2. Frozenset Comprehension

Если вам нужен неизменяемый (immutable) сет:


>>> word_fset = frozenset(w.lower() for w in ["Apple", "Orange", "Apple"])
frozenset({'apple', 'orange'})



3. Counter Comprehension

Класс Counter из модуля collections идеально сочетается с генераторами для быстрого подсчета объектов:


from collections import Counter
words = Counter(w.strip() for w in text.split())



📉 Агрегация через Reducer-функции

Генераторные выражения отлично работают с функциями, которые «сворачивают» (reduce) итерируемый объект в одно значение:
— sum(n**2 for n in numbers) — сумма квадратов.
— "".join(str(n) for n in numbers) — конкатенация строк.
math.prod(n for n in numbers) — произведение элементов.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👏1😢1
🚀 Лестница оптимизации Python

Все знают, что Python медленный. Но мало кто знает, на какой «ступеньке» пора остановиться, чтобы не тратить недели на оптимизацию того, что и так работает.

Разработчик провел масштабный бенчмарк (март 2026) на Apple M4 Pro и составил «лестницу» инструментов.

Оказалось, что дело не только в GIL. Главный виновник — максимальная динамичность. На каждый a + b Python должен спросить: «Что такое a? Что такое b? Есть ли у них метод add? Не подменили ли его секунду назад?». В итоге обычное число в C занимает 4 байта, а в Python — 28 байт «обвязки».

🪜 Ступени лестницы (от простого к сложному):

1. Обновите CPython (Уровень: Легко)

• Профит: до 1.4x (переход с 3.10 на 3.11+).
• Цена: Смена версии в Dockerfile.
• Нюанс: 3.14t (без GIL) в однопотоке чуть медленнее из-за накладных расходов на атомарные операции.

2. Альтернативные рантаймы (PyPy, GraalPy)

• Профит: 6x – 66x.
• Цена: Просто запустить код другим интерпретатором.
• Нюанс: Совместимость с C-библиотеками (pandas, numpy) может быть кривой.

3. Mypyc (Компиляция типов)

• Профит: 2.4x – 14x.
• Цена: Написать нормальные Type Annotations.
• Нюанс: Отлично работает, если ваш код и так проходит строгую проверку mypy.

4. Numba (@njit)

• Профит: 50x – 135x.
• Цена: Один декоратор и перевод данных в массивы NumPy.
• Нюанс: Идеально для тяжелых математических циклов.

5. Cython (Путь джедая)

• Профит: до 124x (уровень нативного C).
• Цена: Знание C и борьба с «минным полем» (например, x ** 0.5 в Cython может быть в 40 раз медленнее, чем `sqrt(x)`).

6. Новая волна (Mojo, Codon, Taichi)

• Профит: до 198x.
• Цена: Сырые инструменты, отсутствие колес (wheels) под новые версии Python. Mojo — это вообще новый язык "в шкуре" Python.

7. Rust (PyO3)

• Профит: 113x – 154x.
• Цена: Изучение Rust.
• Главный плюс: Не чистая скорость, а «владение данными». Rust может распарсить JSON в свои структуры, вообще не создавая медленные Python-словари.

Стеклянный потолок: Словари и JSON

Если ваша задача — гонять JSON (как в реальном мире), то Cython и Rust дадут лишь 4x-6x профита, пока вы используете стандартный json.loads().

Золотое правило: Потолок скорости в вебе — это создание Python-объектов. Если хотите реального рывка, нужно уходить от dict и парсить данные сразу в C-структуры или Rust-типы.


Полный отчет и код бенчмарков: https://clc.to/NgPptA

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍2🥱1
Часовая готовность: создаём ИИ-агента в прямом эфире

В 19:00 МСК в рамках нашего курса «Разработка AI-агентов» стартует вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке.

Будет live-демо работающего агента, реальные метрики из корпоративной среды и честный разбор архитектурных граблей — без воды и «успешного успеха».

Всем зрителям эфира дадим эксклюзивный промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.

👉 Занять место на вебинаре
👍1
Algorithm_Manual.pdf
3.9 MB
The Algorithm Design Manual считается «Библией» для подготовки к собеседованиям в BigTech и незаменимым справочником для тех, кому нужно решать реальные задачи, а не просто доказывать теоремы.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
🐍 Python совет: if при подсчете элементов

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

Как делать не стоит (многословно):

counts = {}
for item in items:
if item in counts:
counts[item] += 1
else:
counts[item] = 1



Используйте `defaultdict` из модуля `collections`

Это специальный тип словаря, который сам создает дефолтное значение для ключа, если его еще нет в объекте:

from collections import defaultdict

counts = defaultdict(int) # указываем тип int как дефолтный (даст 0)
for item in items:
counts[item] += 1



Когда вы инициализируете defaultdict(int), вы говорите Python: «Если ключа нет, создай его и присвой значение, которое возвращает функция int(), то есть **0**».

Преимущества:
— Никаких проверок if item in counts.
— Логика становится линейной и понятной с первого взгляда.
— Меньше шансов допустить ошибку в условиях или инициализации.

Если вам нужно просто посчитать элементы в итерируемом объекте, в Python есть еще более мощный инструмент — Counter:

from collections import Counter

counts = Counter(items)
print(counts.most_common(3)) # Бонус: сразу получаем топ-3 элемента


📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93🔥3