Python/ django
58.9K subscribers
2.08K photos
63 videos
47 files
2.8K links
по всем вопросам @haarrp

@itchannels_telegram - 🔥 все ит-каналы

@ai_machinelearning_big_data -ML

@ArtificialIntelligencedl -AI

@datascienceiot - 📚

@pythonlbooks

РКН: clck.ru/3FmxmM
加入频道
🐍 7 “бесполезных” функций Python, которые на самом деле полезны

Инструменты из стандартной библиотеки, которые могут удивить:

1. textwrap.dedent() — удаляет отступы у многострочного текста.

import textwrap
text = textwrap.dedent(\"\"\"
Привет!
Это текст с отступами.
\"\"\").strip()
print(text)


2. difflib.get_close_matches() — находит похожие строки.

import difflib
words = ["python", "java", "javascript"]
print(difflib.get_close_matches("javascrip", words))


3. uuid.uuid4() — генерирует уникальный ID.

import uuid
print(uuid.uuid4())


4. shutil.get_terminal_size() — узнаёт размеры терминала.

import shutil
columns, rows = shutil.get_terminal_size()
print(f"Размер терминала: {columns}x{rows}")


5. functools.lru_cache() — кэширует результаты функции.

from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) fib(n-2)
print(fib(100))


6. itertools.groupby() — группирует элементы по ключу.

from itertools import groupby
data = [('fruit', 'apple'), ('fruit', 'banana'), ('veg', 'carrot')]
for key, group in groupby(data, lambda x: x[0]):
print(key, list(group))


7. contextlib.suppress() — элегантная альтернатива try-except.

from contextlib import suppress
with suppress(FileNotFoundError):
open("not_exist.txt")


@pythonl
😂 Жиза

@pythonl
🖥 less_slow.py — Python, который не тормозит

Многие считают Python медленным, но это не всегда правда.
Ash Vardanyan в рамках проекта Less Slow показывает, как писать быстрый и эффективный код даже на Python — без магии, но с пониманием.

🐍 Что в проекте:
🔹 pandas vs polars — что быстрее при работе с миллионами строк
🔹 Использование Numba, Cython, PyO3, rust bindings
🔹 Работа с нативными типами, векторизация и zero-copy
🔹 Сериализация без боли: сравнение MessagePack, Arrow, Parquet
🔹 Сравнение аллокаторов, подходов к I/O и нагрузочным тестам
🔹 Ускорение парсинга JSON: orjson, yyjson, simdjson, ujson
🔹 Как обойти GIL и не платить за удобство интерпретатора

📦 Библиотеки и техники:
Numba, Cython, cffi, maturin
simdjson, orjson, polars
pyarrow, msgspec, blosc2, memoryview
Работа с mmap, zero-copy, JIT-компиляция, py-spy, perf

📈 Кому подойдёт:
Тем, кто пишет ETL, пайплайны или ML/AI обработку

Кто работает с большими объёмами данных или бинарными файлами

Кто хочет “оптимизировать до безобразия” и понять, как работает Python под капотом

В серии есть еще 2 крутых проекта:

🖥 less_slow.cpp — C++ без тормозов: ассемблер, кеши, SIMD, аллокации, парсинг JSON и трюки с памятью
👉 github.com/ashvardanian/less_slow.cpp

👣 less_slow.rs — продвинутый Rust: сравнение async/sync, SIMD, кеш-френдли структуры, быстрые сериализации
👉 github.com/ashvardanian/less_slow.rs


📚 Репозиторий:

💡 Даже если ты не используешь всё это каждый день — ты точно станешь писать лучший Python-код.

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 TeleGraphite — быстрый и надёжный скрапер публичных Telegram-каналов на Python.

Возможности:
- Извлечение постов из нескольких каналов в JSON (ID, текст, время, ссылки, почты, телефоны)
- Загрузка медиа (фото, видео, документы)
- Удаление дубликатов
- Однократный режим (telegraphite once) и непрерывный (telegraphite continuous --interval)
- Фильтрация по ключевым словам, типу контента (текст/медиа)
- Планирование запусков по расписанию
- Настройка через CLI и YAML

Установка:
1) pip install telegraphite
2) Создать .env с API_ID и API_HASH
3) Список каналов в channels.txt

Репозиторий
: https://github.com/hamodywe/telegram-scraper-TeleGraphite

@pythonl
🐍 Как просто создать мультисловарь (Multi-dictionary) в Python

Хочешь, чтобы один ключ в словаре указывал на несколько значений?

Легко!

Используй collections.defaultdict и встроенный list:


from collections import defaultdict

multidict = defaultdict(list)
multidict["SW"].append("Han Solo")
multidict["SW"].append("R2D2")


🔁 Теперь каждый ключ по умолчанию сопоставляется с пустым списком. А append добавляет новое значение в этот список.

Но будь внимателен: это немного “обман”. На самом деле словарь всё ещё отображает один ключ → одно значение. Просто это значение — список, в который ты уже сам кладёшь что угодно.

Почему defaultdict удобен?
Потому что тебе не нужно проверять, есть ли ключ в словаре. Пустой список будет создан автоматически при первом обращении к ключу.

@pythonl
🔥 Smolmodels — это библиотека на Python, которая позволяет создавать модели машинного обучения, описывая их поведение на естественном языке и используя минимальное количество кода!

🔍 Основные возможности Smolmodels:

🌟 Определение моделей с помощью естественного языка: Пользователь описывает намерение модели и её входные и выходные схемы на обычном языке, а библиотека автоматически выбирает метрику для оптимизации и генерирует логику для инженерии признаков, обучения модели и её оценки.

🌟 Построение модели: Метод model.build() принимает набор данных (существующий или сгенерированный) и создаёт множество возможных решений модели, обучая и оценивая их для выбора наилучшего.

🌟 Генерация данных и определение схемы: Библиотека может генерировать синтетические данные для обучения и тестирования, что полезно при отсутствии реальных данных или для дополнения существующих.

🔐 Лицензия: Apache-2.0

🖥 Github

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
Мечтаете не просто разбираться в управлении данными, а использовать уникальные инструменты для работы с Big Data? Научитесь этому на бесплатном студкемпе Яндекс Образования и ИТМО по дата-инженерии!

🧠 Программа — интенсивная, актуальная, от лидеров индустрии. С 30 июня по 12 июля вы погрузитесь в мир распределённых хранилищ, микросервисной архитектуры, DataOps/MLOps и пайплайнов для сбора, анализа и визуализации данных. А ещё познакомитесь с технологиями, которые используют в крупных компаниях. В общем, получите реальные навыки, которые ценят на рынке!

🏙 Кампус — в самом центре Санкт-Петербурга. Несмотря на то, что студкемп проходит на базе ИТМО, заявки ждут от студентов из любых вузов и регионов России. Проезд и проживание будут оплачены Яндекс Образованием, так что вам останется сосредоточиться на главном — знаниях, опыте и новых возможностях.

🕐 Регистрация — открыта до 4 мая, но подать заявку можно уже сейчас! Если давно хотели пообщаться с топовыми айтишниками и почувствовать, каково это — учиться в одном из ведущих технических вузов, не откладывайте и заполняйте анкету по ссылке.
🖥 ex — это утилита для создания одного исполняемого файла .pex, внутри которого содержится вся ваша программа на Python и её зависимости. По сути это самодостаточная, переносимая среда выполнения, похожая на virtualenv, но упакованная в один файл.

Зачем это нужно?

Простота развёртывания: чтобы установить и запустить приложение, достаточно скопировать файл app.pex и запустить его — никакой дополнительной настройки.

Портируемость: один файл может включать сборки для разных платформ (Linux, macOS).

Изоляция зависимостей: все библиотеки (включая C‑расширения) уже внутри, конфликтов версий нет.

Как пользоваться:

Устанавливаем сам инструмент:


pip install pex
Собираем .pex-файл:


pex requests -o fetch.pex --script=requests
После этого fetch.pex — готовый исполняемый файл, который при запуске сразу импортирует и запускает библиотеку requests.

Интеграция с другими сборщиками:
Системы вроде Pants, Buck и {py}gradle умеют автоматически собирать .pex-архивы из вашего кода.

Лицензия: Apache 2.0

GitHub: https://github.com/pex-tool/pex
Документация: https://docs.pex-tool.org/

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥Groovy — это транспилер, преобразующий функции Python в их эквиваленты на JavaScript!

🌟 Он используется в библиотеке Gradio, позволяя разработчикам писать функции на Python, которые затем выполняются на стороне клиента как JavaScript, обеспечивая быструю работу. Groovy поддерживает подмножество стандартной библиотеки Python и некоторые специфические классы Gradio, с акцентом на подробное сообщение об ошибках при попытке транспиляции неподдерживаемого кода.

🔐 Лицензия: Apache-2.0

🖥 Github

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Новинка в Python 3.14: t-строки — типобезопасные f-строки

Python 3.14 вводит t"..." — новый синтаксис для строк, ориентированных на безопасность типов и интеграцию с системами шаблонов, SQL, HTML и др.

🔹 Что такое t-строка?
t"..." — это как f"...", но:

- интерполяция ограничена и контролируема;
- поддерживается строгое соответствие шаблону;
- можно передавать переменные явно, предотвращая SQL-инъекции и XSS.

🔸 Пример:

name = "Alice"
greeting = t"Hello, {name}!" # t-строка
Вместо немедленной подстановки, как в f"...", t"..." создает шаблон с выражениями как параметрами.


🔐 Зачем это нужно?
Безопасность при генерации SQL, HTML, JSON

Улучшение инструментов и проверки типов (через static analysis)

Контроль над контекстом исполнения (больше нельзя просто вставить переменную как есть — нужно передать её явно)

📦 Использование:
t-строки — это первый шаг к "template string literals" как в TypeScript.

Можно использовать с функциями:


def html(template: T[str]) -> SafeHTML:
...

html(t"<div>{user_input}</div>")


💡 Почему это важно?
Старый код:


f"SELECT * FROM users WHERE name = '{user_name}'"
может привести к SQL-инъекциям и XSS.
t-строки — безопасная альтернатива с встроенной защитой.


🛡 Пример: безопасный HTML

template = t"<p>{user_input}</p>"
html_output = html(template)
# <p>&lt;script&gt;alert('bad')&lt;/script&gt;</p>

Функция html() может вернуть не просто строку, а полноценный HTMLElement.
Больше никакой "грязи" — всё чисто и типобезопасно.

🔍 Работа с шаблоном
t-строки позволяют получить доступ к содержимому:


template = t"Hello {name}!"
template.strings # ("Hello ", "!")
template.values # (name,)
template.interpolations[0].format_spec # ">8"

Можно и вручную собрать шаблон:


Template("Hello ", Interpolation(value="World", expression="name"), "!")


🚀 Вывод:
t"..." — шаг к безопасным шаблонам и типизации строк в Python.
Готовься к будущему Python — безопасному по умолчанию.

📌 Подробнее здесь

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Zev 🔍

Это помощник для работы с терминалом на естественном языке.

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

pip install zev

📌 Github

@pythonl
Пропал опытный разработчик!

Нашедшему просьба обратиться в Ozon Tech.
Вознаграждение за рекомендацию 150 000 ₽ гарантируют.

Особые приметы, требования, условия на этой странице ⬅️
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 PDF Craft — библиотека на Python для конвертации PDF (в первую очередь сканированных книг) в Markdown и EPUB с использованием локальных AI-моделей и LLM для структурирования содержимого
GitHub

🌟 Основные возможности

- Извлечение текста и макета
Использует сочетание DocLayout-YOLO и собственных алгоритмов для детектирования и фильтрации заголовков, колонтитулов, сносок и номеров страниц

- Локальный OCR
Распознаёт текст на странице через OnnxOCR, поддерживает ускорение на GPU (CUDA)

- Определение порядка чтения
С помощью layoutreader строит поток текста в том порядке, в котором его воспринимает человек

- Конвертация в Markdown
Генерирует .md с относительными ссылками на изображения (иллюстрации, таблицы, формулы) в папке assets

- Конвертация в EPUB
На основе промежуточных результатов OCR передаёт данные в LLM (рекомендуется DeepSeek) для построения оглавления, глав, корректировки ошибок и включения аннотаций

Установка и требования
Python ≥ 3.10 (рекомендуется 3.10.16).

pip install pdf-craft и pip install onnxruntime==1.21.0 (или onnxruntime-gpu==1.21.0 для CUDA).

Для EPUB-конвейера нужен доступ к LLM-сервису (например, DeepSeek).

🟡 Github

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
Твой Senior зарабатывает 800к не потому, что он умнее тебя!

Если ты:
– мучаешься от синдрома самозванца
– устал от токсичности в IT
– не понимаешь, как пройти собеседование в топовые компании
– думаешь «я не дорос/туповат/не готов» (спойлер: это не так!)

…тебе нужно на островок поддержки в мире IT.

Это канал Глеба Михайлова, который прошел путь от тупящего на собесах аналитика до дата саентиста, который поддерживает, вдохновляет и помогает другим процветать в суровой и токсичной IT-индустрии.

Здесь ты найдешь:

– разбор реальных задач с технических собесов (без занудства)
– рабочие советы по подготовке от человека, который работал в Сбере, Альфа-Банке и Яндексе
– инсайты про то, как пройти собеседования в топовых компаниях
– занимательные истории из корпоративной жизни, после которых ты поймешь, что везде работают обычные люди.

Подписывайся на канал, если хочешь расти в IT без токсичности, занудства и пафоса.


Реклама
👾 FlexGet — инструмент, превращающий рутинные задачи в автоматизированные workflows: от скачивания сериалов по RSS до организации медиатеки.

Особенно удобна модульная архитектура проекта. Базовый функционал составляет 150+ плагинов для интеграции с qBittorrent, Plex и другими сервисами. При этом вся логика описывается с помощью декларирования.

🤖 GitHub

@pythonl
🔹 1000 гайдов для разработчиков в одном репозитории!

Разработчик из Твиттера собирал этот настоящий кладезь знаний целых 10 лет.

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

Что там есть:

📚 Инструменты для работы с CLI, GUI, вебом и локальными сетями.

📦 Списки всех актуальных фреймворков и библиотек 2025 года.

🛡 Гайды по тестированию и взлому приложений.

🔥 Шпаргалки по командной строке.

📰 Огромная подборка блогов, YouTube-каналов, онлайн-СМИ и журналов, чтобы быть в курсе и не терять хватку.

Фолиант знаний ждёт тебя!

📌 Github

@pythonl
🖥 Задача: "Кэширование и ленивые вычисления в многопоточном окружении"

🔜 Условие:

Вам нужно реализовать декоратор @thread_safe_cached, который:

- Кэширует результат вызова функции по её аргументам (аналог functools.lru_cache, но свой).
- Если несколько потоков одновременно вызывают функцию с одинаковыми аргументами:
- Только один поток реально выполняет функцию,
- Остальные ждут, пока результат будет вычислен, и получают готовый результат.
- Кэш никогда не удаляется (неограниченный размер).

Ограничения:

- Решение должно работать для произвольных функций и аргументов (hashable).
- Нельзя использовать готовый functools.lru_cache или другие библиотеки кэширования.
- Нужно обеспечить корректную работу в многопоточной среде без гонок данных.

---

▪️ Подсказки:

- Для кэширования подойдёт dict с ключами по аргументам (`*args`, `**kwargs`).
- Для защиты доступа к кэшу понадобится threading.Lock.
- Для ожидания завершения вычисления другими потоками можно использовать threading.Event.
- Продумайте carefully: как отличить "результат уже посчитан" от "результат в процессе вычисления".

---

▪️ Что оценивается:

- Умение работать с многопоточностью в Python.
- Правильная организация кэширования.
- Чистота и лаконичность кода.
- Умение обрабатывать тонкие случаи, например: одновременные вызовы.

---

▪️ Разбор возможного решения:

Основная идея:

- Создать кэш cache: Dict[Key, Result].
- Одновременно создать словарь "ожиданий" in_progress: Dict[Key, threading.Event].
- Если кто-то начал считать значение:
- Остальные ждут Event, пока оно не будет установлено.

Пример реализации:


import threading
import functools

def thread_safe_cached(func):
cache = {}
in_progress = {}
lock = threading.Lock()

@functools.wraps(func)
def wrapper(*args, **kwargs):
key = (args, frozenset(kwargs.items()))
with lock:
if key in cache:
return cache[key]
if key not in in_progress:
in_progress[key] = threading.Event()
in_progress[key].clear()
creator = True
else:
creator = False

if creator:
try:
result = func(*args, **kwargs)
with lock:
cache[key] = result
finally:
in_progress[key].set()
with lock:
del in_progress[key]
return result
else:
in_progress[key].wait()
with lock:
return cache[key]

return wrapper


---

▪️ Пояснения к коду:

- При первом вызове для новых аргументов поток создаёт Event и начинает считать результат.
- Остальные потоки видят Event и вызывают wait(), пока первый поток не установит set().
- Как только результат посчитан, Event сигнализирует всем ждущим потокам, что данные готовы.
- Доступ к cache и in_progress защищён через lock для избежания гонок.

---

▪️ Возможные подводные камни:

- Если не удалять Event из in_progress, кэш постепенно раздуется мусором.
- Если ошибка случится внутри func, необходимо всё равно освободить Event, иначе потоки будут вечно ждать.
- Нельзя держать lock во время выполнения тяжёлой функции func, иначе все потоки будут блокироваться.

---

▪️ Вопросы на собеседовании по этой задаче:

- Как изменить реализацию, чтобы кэш имел ограничение по размеру (например, максимум 1000 элементов)?
- Как адаптировать декоратор под асинхронные функции (`async def`)?
- Что будет, если func иногда бросает исключения? Как кэшировать ошибки или не кэшировать их?
- Как изменить реализацию так, чтобы кэш удалял устаревшие данные через TTL (Time-To-Live)?

---

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ snnTorch — нейросети, которые работают как мозг. Этот проект предлагает необычный подход к машинному обучению, используя импульсные нейронные сети вместо классических искусственных нейронов.

Инструмент передает информацию через импульсы, что ближе к принципам работы биологического мозга. Библиотека построена на PyTorch и позволяет обучать такие сети с помощью обратного распространения ошибки, используя специальные суррогатные градиенты.

🤖 GitHub

@pythonl
Хочешь понять, твое ли аналитика — без курсов, затрат и лишнего стресса?

🔍 Пройди кейс-тест на реальной бизнес-задаче — всё, как в работе настоящего аналитика, но без необходимости иметь профильные навыки. Только мышление, логика и внимательность.

⚡️ Всего 10 конкретных вопросов — от постановки цели до финальных выводов. За 60 минут: — получишь реальные вводные от "коллег",
— прокачаешь структурное мышление,
— поймешь, насколько тебе подходит аналитика,
— получишь обратную связь на каждый шаг.

🔥 Это бесплатный шанс примерить новую профессию — вдруг это именно твое?

👉 Нажми, чтобы начать тест прямо сейчас
Что выведет этот код при запуске на Python 3.10+ (например, 3.11)?


📌 Подсказка: Подумайте о порядке проверок, о том, какие атрибуты попадают в others, и об использовании __match_args__.

Ответ:

Automatic mode
Mode manual, other keys: ['threshold', 'debug']
Low threshold 0
Краткое пояснение:

Для первого объекта (mode="auto", threshold=10) срабатывает первый case Config(mode="auto") → Automatic mode.

Для второго (mode="manual", threshold=5, debug=True) первый не совпадает, второй с threshold<5 не проходит (5 < 5 → False), зато третий case Config(mode=mode, **others) — биндинг mode='manual', остальные ключи (threshold и debug) попадают в others → Mode manual, other keys: ['threshold', 'debug'].

Для третьего (threshold=0) первый и третий не подходят (нет mode), а второй — case Config(threshold=threshold) if threshold<5 — срабатывает (0<5) → Low threshold 0.


@pythonl