по всем вопросам @haarrp @itchannels_telegram - 🔥 best it channels @ai_machinelearning_big_data -ML @ArtificialIntelligencedl -AI @datascienceiot - ml 📚 @pythonlbooks -📚books
⚡️ snnTorch — нейросети, которые работают как мозг. Этот проект предлагает необычный подход к машинному обучению, используя импульсные нейронные сети вместо классических искусственных нейронов.
Инструмент передает информацию через импульсы, что ближе к принципам работы биологического мозга. Библиотека построена на PyTorch и позволяет обучать такие сети с помощью обратного распространения ошибки, используя специальные суррогатные градиенты.
🤖 GitHub
@pythonl
🔹 1000 гайдов для разработчиков в одном репозитории!
Разработчик из Твиттера собирал этот настоящий кладезь знаний целых 10 лет.
Внутри — буквально всё:
от шпаргалок по горячим клавишам для ускорения работы до фундаментальных руководств по языкам программирования, веб-разработке, созданию ПО, сетям, безопасности и многому другому.
Что там есть:
📚 Инструменты для работы с CLI, GUI, вебом и локальными сетями.
📦 Списки всех актуальных фреймворков и библиотек 2025 года.
🛡 Гайды по тестированию и взлому приложений.
🔥 Шпаргалки по командной строке.
📰 Огромная подборка блогов, YouTube-каналов, онлайн-СМИ и журналов, чтобы быть в курсе и не терять хватку.
Фолиант знаний ждёт тебя!
📌 Github
@pythonl
Твой Senior зарабатывает 800к не потому, что он умнее тебя!
Если ты:
– мучаешься от синдрома самозванца
– устал от токсичности в IT
– не понимаешь, как пройти собеседование в топовые компании
– думаешь «я не дорос/туповат/не готов» (спойлер: это не так!)
…тебе нужно на островок поддержки в мире IT.
Это канал Глеба Михайлова, который прошел путь от тупящего на собесах аналитика до дата саентиста, который поддерживает, вдохновляет и помогает другим процветать в суровой и токсичной IT-индустрии.
Здесь ты найдешь:
– разбор реальных задач с технических собесов (без занудства)
– рабочие советы по подготовке от человека, который работал в Сбере, Альфа-Банке и Яндексе
– инсайты про то, как пройти собеседования в топовых компаниях
– занимательные истории из корпоративной жизни, после которых ты поймешь, что везде работают обычные люди.
Подписывайся на канал, если хочешь расти в IT без токсичности, занудства и пафоса.
Реклама
Пропал опытный разработчик!
Нашедшему просьба обратиться в Ozon Tech.
Вознаграждение за рекомендацию 150 000 ₽ гарантируют.
Особые приметы, требования, условия на этой странице ⬅️
❓ Как повысить свои навыки в аналитике данных за 90 минут?
Прийти на бесплатный практический урок 28 апреля, где мы расскажем, как эффективно работать с данными с помощью Python и Pandas: как заполнять пропуски, устранять дубликаты и правильно работать с выбросами.
👥 Кому будет полезен вебинар?
- тем, кто только начинает свой путь в Data Science и хочет освоить базовые навыки
- тем, кто работает с данными в электронных таблицах, но хочет перейти на Python и Pandas
- тем, кто сталкивался с ошибками при анализе из-за «мусора» в данных
- тем, кто планирует изучать машинное обучение (ML), где чистота данных критически важна
📍 Зарегистрируйтесь и получите скидку на большое обучение «Специализация Machine Learning»: https://otus.pw/UkAO/?erid=2W5zFG6E7sW
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🖥 Groovy — это транспилер, преобразующий функции Python в их эквиваленты на JavaScript!
🌟 Он используется в библиотеке Gradio, позволяя разработчикам писать функции на Python, которые затем выполняются на стороне клиента как JavaScript, обеспечивая быструю работу. Groovy поддерживает подмножество стандартной библиотеки Python и некоторые специфические классы Gradio, с акцентом на подробное сообщение об ошибках при попытке транспиляции неподдерживаемого кода.
🔐 Лицензия: Apache-2.0
🖥 Github
@pythonl
🖥 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
🔥 Smolmodels — это библиотека на Python, которая позволяет создавать модели машинного обучения, описывая их поведение на естественном языке и используя минимальное количество кода!
🔍 Основные возможности Smolmodels:
🌟 Определение моделей с помощью естественного языка: Пользователь описывает намерение модели и её входные и выходные схемы на обычном языке, а библиотека автоматически выбирает метрику для оптимизации и генерирует логику для инженерии признаков, обучения модели и её оценки.
🌟 Построение модели: Метод model.build() принимает набор данных (существующий или сгенерированный) и создаёт множество возможных решений модели, обучая и оценивая их для выбора наилучшего.
🌟 Генерация данных и определение схемы: Библиотека может генерировать синтетические данные для обучения и тестирования, что полезно при отсутствии реальных данных или для дополнения существующих.
🔐 Лицензия: Apache-2.0
🖥 Github
@pythonl
🔥 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
🔍 Основные нововведения в Django 5.2
1. 📦 Автоматический импорт моделей в интерактивной оболочке
Теперь при запуске команды python manage.py shell все модели из установленных приложений автоматически импортируются.
Это упрощает работу в интерактивной оболочке, позволяя сразу использовать модели без необходимости ручного импорта. Для получения подробностей об импортированных объектах можно использовать флаг -v 2.
2. 🔗 Поддержка составных первичных ключей
Django 5.2 вводит нативную поддержку составных первичных ключей через класс CompositePrimaryKey. Это позволяет создавать таблицы с первичным ключом, состоящим из нескольких полей, без необходимости использования сторонних решений.
3. 🧩 Гибкая настройка BoundField в формах
Теперь можно переопределять класс BoundField на уровне проекта, формы или отдельного поля, устанавливая атрибут bound_field_class. Это предоставляет разработчикам более тонкий контроль над отображением и поведением форм.
4. ⚡ Расширенная асинхронная поддержка
Django продолжает движение в сторону асинхронности, добавляя новые асинхронные методы и улучшая реализацию бэкендов аутентификации. Это особенно полезно для операций, связанных с вводом-выводом, и способствует созданию более производительных приложений.
5. 🎨 Новые виджеты форм и улучшения интерфейса
Добавлены новые виджеты форм, такие как ColorInput, SearchInput и TelInput, соответствующие стандартам HTML5. Также улучшена доступность форм для пользователей с особыми потребностями.
Bastaki Software Solutions L.L.C-FZ
6. 🗃️ Улучшения в работе с базой данных
Поддержка изогнутых геометрий в GDAL, включая CurvePolygon, CompoundCurve, CircularString, MultiSurface и MultiCurve.
По умолчанию соединения с MySQL используют кодировку utf8mb4 вместо устаревшей utf8mb3.
Улучшена работа методов values() и values_list(), теперь они генерируют SELECT-запросы в указанном порядке.
🔧 Совместимость и поддержка
Django 5.2 поддерживает Python версий 3.10–3.13.
С выходом этой версии, основная поддержка Django 5.1 завершена. Последний минорный релиз 5.1.8, также содержащий обновления безопасности, был выпущен одновременно с 5.2.
Django 5.0 достиг конца расширенной поддержки. Последний релиз безопасности, 5.0.14, также был выпущен сегодня. Рекомендуется обновиться до версии 5.1 или более новой.
📥 Обновление и ресурсы
Загрузить Django 5.2 можно с официальной страницы загрузки или через PyPI.
Полные примечания к релизу доступны в официальной документации.
Для автоматического обновления кода и устранения устаревших конструкций можно использовать инструмент django-upgrade.
Django Project
Django 5.2 предлагает множество улучшений, направленных на упрощение разработки и повышение производительности приложений. Рекомендуется ознакомиться с новыми возможностями и планировать обновление своих проектов для использования всех преимуществ этой версии.
📌 Релиз
@pythonl
🚀 Python-разработчик — от основ до синьора.
Если вы ищете структурированный roadmap в бэкенд-разработке на Python, обратите внимание на дорожную карту от Boot.dev. Она начинается с базовых навыков (Linux, Git, ООП) и ведёт к сложным темам: алгоритмы, HTTP-серверы, безопасность и DevOps-инструменты.
Создатели сделали акцент на практике. После каждого теоретического блока предлагается создать проект: от простого бота до агрегатора блогов с использованием SQL и облачных хранилищ.
🤖 GitHub
@python_job_interview
🐍 Dulwich — проект, предлагающий альтернативу классическим библиотекам вроде GitPython и pygit2. Это полностью Python-реализация Git-клиента без зависимостей от нативного Git.
Инструмент поддерживает как низкоуровневые операции с репозиториями, так и сложные команды, имитирующие интерфейс командной строки Git. Для тех, кому важна производительность, есть опциональные Rust-расширения.
🤖 GitHub
@pythonl
🖥 Python на скорости Rust
Новый Function (fxn) — фреймворк, который компилирует Python-функции в нативный код с производительностью, сравнимой с Rust.
🧠 Как это работает?
- Использует символическое трассирование на CPython для анализа функций
- Генерирует промежуточное представление (IR)
- Транслирует IR в C++ или Rust, а затем компилирует в бинарный код
- Поддерживает платформы: Linux, Android, WebAssembly и др.
📦 Пример:
@compile
def fma(x: float, y: float, z: float) -> float:
return x * y + z
После компиляции вы получаете нативный бинарник, который можно запускать без интерпретатора Python.
🔗 Подробнее
🔗 Github
@pythonl
#Python #Rust #fxn #Compiler #Performance #AI #ML #Wasm
🌟 TARIFF — инструмент, который вы реально ждали, Python-пакет, который делает импорты «Великими» снова.
Инструмент позволяет вводить "пошлины" на Python-библиотеки, замедляя загрузку определённых пакетов, чтобы подчеркнуть идею "экономического протекционизма" в коде.
✔️ Основные особенности
Имитация тарифов на импорты: пользователь может установить "тарифы" (в процентах) на определённые пакеты, например:
import tariff
tariff.set({
"numpy": 50, # 50% тариф на numpy
"pandas": 200, # 200% тариф на pandas
"requests": 150 # 150% тариф на requests
})
JUST IMPOSED a 50% TARIFF on numpy! Original import took 45000 us, now takes 67500 us. American packages are WINNING AGAIN! #MIPA
🖥 Задача: "Кэширование и ленивые вычисления в многопоточном окружении"
🔜 Условие:
Вам нужно реализовать декоратор @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
, иначе все потоки будут блокироваться.func
иногда бросает исключения? Как кэшировать ошибки или не кэшировать их?👾 FlexGet — инструмент, превращающий рутинные задачи в автоматизированные workflows: от скачивания сериалов по RSS до организации медиатеки.
Особенно удобна модульная архитектура проекта. Базовый функционал составляет 150+ плагинов для интеграции с qBittorrent, Plex и другими сервисами. При этом вся логика описывается с помощью декларирования.
🤖 GitHub
@pythonl
🖥 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
Zev 🔍
Это помощник для работы с терминалом на естественном языке.
Он помогает быстро находить нужные команды и сохранять их в избранное, а его простой и понятный интерфейс делает освоение терминала доступным даже для новичков.pip install zev
📌 Github
@pythonl
🖥 Новинка в 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"..." создает шаблон с выражениями как параметрами.
def html(template: T[str]) -> SafeHTML:
...
html(t"<div>{user_input}</div>")
f"SELECT * FROM users WHERE name = '{user_name}'"
может привести к SQL-инъекциям и XSS.
t-строки — безопасная альтернатива с встроенной защитой.
template = t"<p>{user_input}</p>"
html_output = html(template)
# <p><script>alert('bad')</script></p>
template = t"Hello {name}!"
template.strings # ("Hello ", "!")
template.values # (name,)
template.interpolations[0].format_spec # ">8"
Template("Hello ", Interpolation(value="World", expression="name"), "!")
Уже разбираетесь в Python, но хотите большего? Тогда вам на PiterPy 2025
🗓️16–17 мая
📍 Питер + онлайн
PiterPy — конференция для всех, кто использует Python в работе. Здесь собираются бэкенд-разработчики, тестировщики, DevOps, дата- и ML-инженеры и аналитики, а также тимлиды.
Перед вами выступят спикеры из Яндекса, Т-Банка, Точки, Авито, Ozon и других известных компаний. Вас ждет два дня докладов про бэкенд и архитектуру, библиотеки и инструменты, практики разработки и Core Python, а еще мастер-класс по программированию роботов.
А вот что с билетами:
→ Дают скидку 15% на билет для частных лиц по промокоду DJANGO
;
→ Есть билет для студентов и преподавателей вузов — в два раза дешевле персонального;
→ Можно попросить руководство приобрести вам корпоративный билет.
Бонус: в соседних залах пройдет ML-конференция IML. Участники PiterPy смогут послушать доклады IML бесплатно.
За подробностями и билетами
Мечтаете не просто разбираться в управлении данными, а использовать уникальные инструменты для работы с Big Data? Научитесь этому на бесплатном студкемпе Яндекс Образования и ИТМО по дата-инженерии!
🧠 Программа — интенсивная, актуальная, от лидеров индустрии. С 30 июня по 12 июля вы погрузитесь в мир распределённых хранилищ, микросервисной архитектуры, DataOps/MLOps и пайплайнов для сбора, анализа и визуализации данных. А ещё познакомитесь с технологиями, которые используют в крупных компаниях. В общем, получите реальные навыки, которые ценят на рынке!
🏙 Кампус — в самом центре Санкт-Петербурга. Несмотря на то, что студкемп проходит на базе ИТМО, заявки ждут от студентов из любых вузов и регионов России. Проезд и проживание будут оплачены Яндекс Образованием, так что вам останется сосредоточиться на главном — знаниях, опыте и новых возможностях.
🕐 Регистрация — открыта до 4 мая, но подать заявку можно уже сейчас! Если давно хотели пообщаться с топовыми айтишниками и почувствовать, каково это — учиться в одном из ведущих технических вузов, не откладывайте и заполняйте анкету по ссылке.
🐍 Как просто создать мультисловарь (Multi-dictionary) в Python
Хочешь, чтобы один ключ в словаре указывал на несколько значений?
Легко!
Используй collections.defaultdict и встроенный list:
from collections import defaultdict
multidict = defaultdict(list)
multidict["SW"].append("Han Solo")
multidict["SW"].append("R2D2")
defaultdict
удобен?🖥 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
🐍 7 “бесполезных” функций Python, которые на самом деле полезны
Инструменты из стандартной библиотеки, которые могут удивить:
1. textwrap.dedent() — удаляет отступы у многострочного текста.
import textwrap
text = textwrap.dedent(\"\"\"
Привет!
Это текст с отступами.
\"\"\").strip()
print(text)
import difflib
words = ["python", "java", "javascript"]
print(difflib.get_close_matches("javascrip", words))
import uuid
print(uuid.uuid4())
import shutil
columns, rows = shutil.get_terminal_size()
print(f"Размер терминала: {columns}x{rows}")
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))
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))
from contextlib import suppress
with suppress(FileNotFoundError):
open("not_exist.txt")
⚡️Строим рекомендательную систему фильмов на Kaggle
Вы когда-нибудь хотели сделать свою собственную систему рекомендаций фильмов? 🎬
Приходите на бесплатный вебинар, где Савелий Батурин, Senior ML-Engineer и преподаватель курса по ML школы Simulative в прямом эфире покажет как построить рекомендательную систему фильмов на Kaggle.
Что будем делать на вебинаре:
🟠Разберем имеющиеся данные фильмов с их оценками
🟠Проведем предобработку данных
🟠Построим рекомендательную систему на основе машинного обучения
🟠Проведем расчет и анализ метрик на основе результатов работы модели
Вебинар будет интересен как новичкам, так и уже опытным специалистам
😶Зарегистрироваться на бесплатный вебинар
👩💻 Docker — лучший канал для ускоренного обучения DevOps.
С помощью инфографики, наглядных визуализаций и коротких обучающих видео вы изучите все ключевые концепции работы с Docker и методики DevOps.
Прокачать скиллы: t.me/DevopsDocker
Поздравляем, вы на 1 шаг ближе к работе мечты 🥳
Осталось только прочитать этот пост, подписаться на канал и откликнуться на вакансию 😉
Avito Career — место, где Авито делится актуальными вакансиями и стажировками для Python-разработчиков.
Подписывайтесь, чтобы найти ту самую работу ✨
📌 Tracecat — open-source платформа для автоматизации безопасности. Этот проект предлагает YAML-шаблоны для создания workflow с визуальным редактором, упрощая автоматизацию рутинных задач.
Инструмент позволяет интегрировать Temporal для надёжного выполнения сценариев и поддержка MITRE D3FEND. Локальный запуск возможен через Docker Compose, а для продакшена есть Terraform-конфиги для AWS Fargate.
🤖 GitHub
@pythonl
🖥 Важная особенность генераторов в Python!
Давай разберемся, как это работает:
Что такое Генератор?
Функция my_generator_function
является генератором, потому что она использует ключевое слово yield
.
В отличие от обычной функции, которая выполняет весь код и возвращает одно значение через return, генератор "приостанавливается" на каждом yield, возвращая указанное значение.
При следующем вызове он возобновляет работу с того места, где остановился.
Как работает yield
:
Когда вы вызываете gen = my_generator_function()
, код внутри функции не выполняется.
Создается специальный объект-генератор (gen
).
Первый вызов next(gen)
заставляет функцию выполниться до первого yield 1. Функция возвращает 1 и приостанавливается.
Второй вызов next(gen) возобновляет выполнение с точки после yield 1 и доходит до yield 2. Функция возвращает 2 и снова приостанавливается.
Именно поэтому print(next(gen), next(gen)) выводит 1 2.
Как работает return в генераторе:
Когда поток выполнения внутри генератора доходит до оператора return (в нашем случае return 73) или просто до конца функции без явного return, генератор считается завершенным.
Важно: Значение, указанное в return (здесь 73), не возвращается как обычное значение через yield. Вместо этого генератор выбрасывает (raises) специальное исключение: StopIteration.
Этот механизм StopIteration - стандартный способ в Python сигнализировать, что итератор (а генератор - это тип итератора) исчерпан.
Перехват StopIteration и получение значения:
В правой части кода мы пытаемся вызвать next(gen) еще раз.
Генератор возобновляется после yield 2, доходит до return 73 и выбрасывает StopIteration.
Конструкция try...except StopIteration as err: перехватывает это исключение.
Ключевой момент (показан стрелкой на картинке): Значение, которое было указано в операторе return генератора (73), становится доступным как атрибут .value пойманного исключения StopIteration.
Поэтому print(err.value) в
ыводит # 73.
Итог:
Teturn в генераторе не производит очередное значение, а завершает его работу. При этом значение из return "упаковывается" в исключение StopIteration, сигнализирующее об окончании, и его можно извлечь из атрибута .value этого исключения, если перехватить его вручную.
Стандартный цикл for item in generator(): в Python автоматически обрабатывает StopIteration (просто завершает цикл) и не дает прямого доступа к err.value. Поэтому для демонстрации этого механизма и получения возвращаемого значения используется явный вызов next() внутри блока try...except.
@pythonl