20070
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL
Что значит стрелка ->
Если вы столкнулись со знаком -> в коде на Python и задумались, а не код из R ли это нужно ли это, как это работает и откуда оно взялось, этот лонгрид ответит на такие вопросы.
Стрелка в определении функции служит для аннотации типа возвращаемого значения. Она ставится после списка параметров и перед двоеточием:
def count_titles(titles: list[str]) -> int:
return len(titles)
-> int говорит: «ожидается, что функция вернёт int». Аннотации опциональны и сами по себе ничего в рантайме не проверяют — это метаданные.
import random
def get_game_recommendation(titles: list[str]) -> str:
return random.choice(titles)
games = ["Minecraft", "Cyberpunk 2077", "The Witcher 3", "Elden Ring"]
recommendation = get_game_recommendation(games)
print(f"Рекомендуемая игра: {recommendation}") # Например, Minecraft
print(f"Тип возвращаемого значения: {type(recommendation).__name__}") # str
->?-> встречается в объявлениях функций, аннотации — это часть более широкой системы типизации в Python. Типы используются для:Callable, Protocol и т.д.;
Кратко о современном деплое: контейнеризация, оркестрация и непрерывная доставка для вашего приложения
Развёртывание: это процесс, при котором ваше приложение становится доступно для пользователей. Современный деплой использует инструменты и пайплайны для обеспечения стабильности, скорости и надежности. Ниже попытались разложить всё по полочкам 👇
Docker (Контейнеризация)Читать полностью…
🔘 Представьте Docker как транспортный контейнер для софта.
🔘 Он упаковывает код, библиотеки и зависимости так, чтобы приложение одинаково работало в любой среде.
🔘 Плюсы: портативность, изоляция и одинаковое поведение в dev-, staging- и production-средах.
Kubernetes (Оркестрация)
🔘 Когда контейнеров становится много, нужен управляющий.
🔘 Kubernetes — это как портовая служба, которая управляет контейнерами: масштабирует, перезапускает, балансирует нагрузку.
🔘 Обеспечивает балансировку нагрузки, масштабирование, поэтапные обновления и самовосстановление контейнерных приложений.
CI/CD (Непрерывная интеграция и доставка)
🔘 CI — это как проверка каждого продукта перед отправкой с завода: тесты запускаются автоматически при каждом пуше кода.
🔘 CD — это система доставки: одобренные изменения автоматически едут в production.
🔘 Плюсы: более быстрые релизы, меньше багов, проще командная работа.
Аналогия
🔘 Docker — Запечатанная коробка с вашим товаром.
🔘 Kubernetes — Логистическая компания, которая организует и доставляет все коробки по назначению.
🔘 CI/CD — Конвейер, на котором коробки непрерывно отправляются дальше без задержек.
python-dateutil | datetime, который смог
Ультрапопулярное (если верить рейтингу PyPi) расширение стандартного модуля datetime, поддерживает:
— Вычисление «следующего X»: удобно находим даты следующего понедельника или последней недели месяца;
— Относительные дельты: вычисляем разницу между двумя датами не только в секундах, но и в понятных календарных единицах (например, «2 месяца и 5 дней»);
— Рекуррентные даты (повторяющиеся события)
Поддерживается генерация серий дат по очень гибким правилам, расширяющим стандарт iCalendar (например: «каждый второй вторник месяца до конца года») и многое другое.
Еще бы русский язык поддерживала, цены бы не было!
#инструмент
@zen_of_python
😊 Как организовать работу с данными, чтобы не утонуть в бюрократии?
😊 Какие подводные камни ждут при миграции всего банка в облако?
😊 Как силами NLP в 30 раз ускорить обработку клиентских обращений?
В гайдах для начинающих на такие вопросы вряд ли найдется ответ. А вот в телеграм-канале OTP Tech точно найдется наглядный разбор.
В OTP Tech вы получите реальный опыт внедрения сложных решений в продакшен крупного финтеха. Ну и просто фановый интерактив, который поможет разгрузить голову.
Если вы разрабатываете, проектируете или администрируете и хотите смотреть дальше хеллоу ворлдов — вам будет здесь интересно.
Присоединяйтесь: @otp_tech
Травма поколений в исполнении Python-комьюнити
#кек
@zen_of_python
А может ну это всё и улететь работать в космос?
На станцию Контур активно ищут новобранцев. Берут тех, кто разбирается в программировании, тестировании, UX-исследованиях и аналитике.
Запускайте бота и проходите миссии. В конце — розыгрыш целого бокса с космическим мерчем!
🚀Стажировка уже началась. Вперёд!
Новый синтаксис Python от Grok
#кек
@zen_of_python
Вопросы подписчиков
Zen of Python поддерживает новоприбывших (и не только) в особой рубрике. Как это работает:
— Спрашивайте что угодно (в комментариях под этим постом), связанное с Python. Здесь нет плохих вопросов!
— Сообщество вас поддержит. Самые интересные вопросы мы разберём в отдельном посте.
#обсуждение
@zen_of_python
Hypothesis подумает о пограничных случаях за вас
Библиотека property-based тестирования, где вместо ручного набора тест-кейсов вы описываете свойства, которым должен соответствовать код, а разнообразные данные генерируются и проверяются автоматически, включая граничные случаи.
При обнаружении сбоя Hypothesis не просто сигнализирует об ошибке — он возвращает наиболее простой пример, приводящий к сбою, что значительно облегчает отладку.
#инструмент
@zen_of_python
Этот код демонстрирует:
🔘 короткое замыкание (401 и 429 останавливают конвейер);
🔘 прохождение запроса дальше при None;
🔘 терминальный обработчик 404.
Политики прохождения запроса
🔘 Short-circuit (рекомендуется по умолчанию): первый, кто вернул результат, «закрывает» цепочку;
🔘 Fall-through: все обработчики обязаны отработать (например, аудит/метрики/логирование), результат — агрегация;
🔘 Микс: часть «жёстких» (аутентификация, лимиты) — short-circuit; «мягкие» (логирование) — всегда проходят.
#основы
@zen_of_python
CodeViz: бесплатное дополнение для VS Code, превращающее код в интерактивную карту 😬
Плагин строит визуальную структурированную карту вашего кода прямо в IDE. Можно наглядно увидеть архитектуру проекта, связи между файлами и понять его суть.
Поддерживается масса яп, всё работает быстро и абсолютно бесплатно. Сохраняйте.
Вопрос подписчика
Задает @StSav012:
«Предлагаю задачку на алгоритм.
Для данных n ∈ ℕ и чётного N ≥ n > 1, N ∈ ℕ, найти чётное ñ, ближайшее к n, являющееся делителем N. Если таких чисел несколько, выбрать наибольшее.Конечно, хочется скорость O(log(n)).
def find_closest_even_divisor(n: int, max_n: int) -> int:
"""
For given n ∈ ℕ and an even N ≥ n, N ∈ ℕ,
find an even ñ closest to n so that ñ is a divisor of N.
If there are several such numbers, pick the largest one.
"""
if max_n <= 0:
raise ValueError(f"There are no positive divisors for {max_n}")
if max_n & 1:
raise ValueError(f"There are no even divisors for {max_n}, which is odd")
if n > 0.75 * max_n:
return max_n
if max_n % n == 0 and n & 1 == 0:
return n
divisors: list[int] = []
dd: int = 1
while max_n > 1 and max_n & 1 == 0:
max_n >>= 1
dd <<= 1
divisors.append(dd)
d: int = 3
dc: list[int]
while max_n > 1:
dc = []
dd = 1
while max_n % d == 0:
max_n //= d
dd *= d
dc.append(dd)
else:
if dc:
divisors += [divisor * dd for divisor in divisors for dd in dc]
if d < isqrt(max_n) and d < 2 * n:
d += 2
else:
break
return min(divisors, key=lambda _d: (abs(n - _d), -_d))
Самое время собрать свою команду из IT-акул: Открыта регистрация на самый масштабный онлайн-хакатон в мире — «Лидеры цифровой трансформации»!
⚡️40 млн рублей призового фонда:
— 1 млн рублей — для тех, кто займёт первое место
— 600 тысяч — второе
— 400 тысяч — третье
20 актуальных задач от ведущих компаний страны: Газпромбанк.Тех, VK Tech, Kaspersky, АФЛТ-Системс (Группа «Аэрофлот»), Союзмультфильм, Авито, Итэлма, ОЭЗ «Алабуга», Х5.
14 дней на разработку решений.
Призёрами хакатона станут 60 команд!
Принять участие могут:
🔘граждане РФ и других стран от 18 лет
🔘специалисты: Front / Back / FullStack, Web-разработчики, UX / UI дизайнеры, Product / Project-менеджеры, Data Scientists, Data Engineers, аналитики и другие профессионалы
🔘местоположение — неважно, всё проходит онлайн
Других ограничений нет!
📎 Успейте зарегистрироваться до 18 сентября!
А больше новостей и подробностей — на нашем канале, подписывайтесь.
Это #партнёрский пост
Google Image Scraper | Массовый парсинг картинок из Google
Тул помогает собирать сотни изображений для любой вашей цель — будь то ML-датасет, дизайн или что-то еще. При запуске указываем ключевые слова, количество файлов и параметры — и скрипт автоматически выгрузит нужные фото в нужном разрешении. Поддерживает работу в headless-режиме, гибкую настройку качества и параллельные загрузки.
Цена: бесплатно
#инструмент
@zen_of_python
Пост для питонисток: история PyLadies
Но история сообщества Python — это не только код. Это ещё и путь к тому, чтобы люди разного пола и разного опыта могли почувствовать себя в нём своими. Одним из главных шагов в этом направлении стало появление PyLadies.
От футболки с надписью «Python is for girls» к первому шагу
На заре популярности Python о гендерном балансе в сообществе почти не задумывались. Даже сама Python Software Foundation (PSF), по словам одного из участников документального фильма, состояла «исключительно из белых мужчин».
Даже когда Гвидо ван Россум на одной из PyCon публично заявил, что в PSF нужны женщины, ситуация почти не сдвинулась. В кулуарах и списках рассылки обсуждали код, но не то, как привлечь к этому коду новые голоса.
Прошло время, и выяснилось: простого заявления мало. Сообщество не менялось. Новые женщины-разработчицы по-прежнему чувствовали себя изолированными, а в «ядре» Python не было ни одной из них.
Только когда сам Гвидо решился на личное участие, ситуация начала меняться. Он взял на себя роль ментора для разработчицы Мариатты Виджайа, которая сначала сомневалась, «достойна ли» просить о поддержке создателя языка. Менторство Гвидо помогло ей преодолеть барьер и в итоге стать одной из первых женщин — Python Core Developers.
Сегодня именно две женщины, включая Мариатту, входят в PSF. Порой, первым действовать должен начать глава.
PyLadies сегодня
Для крупных городов и даже целых стран начали создаваться локальные отделения: Pyadies Moscow, PyLadies Kazan, PyLadies Saint Petersburg. Только в этих сообществах, по мнению админа, сейчас как-то слишком тихо.
PyLadies не только увеличили долю женщин-спикеров на PyCon (с 1% в 2011 году до 40% в 2016-м), но и изменили саму культуру Python.
#факт
@zen_of_python
YTSage | Скачиватель с YouTube
Инструмент с несложным GUI на PySide6 c yt-dlp под капотом. Позволяет выбрать HD-качество, извлечь субтитры. Поддерживает скачивание плейлистов с возможностью выбрать конкретные видео перед загрузкой.
#инструмент
@zen_of_python
Алгоритмы и структуры данных на Python
Уже ставшая классикой, книга поможет вам освоить алгоритмическое мышление. Помимо основ, вы познакомитесь с алгоритмами сортировки, поиска, деревьями, графами, динамическим программированием и жадными методами — всё написано с акцентом на Python-реализацию. Сильная сторона книги — реальные проекты: от простого калькулятора до системы обнаружения плагиата. Независимо от вашего уровня, вы найдёте в ней полезные идеи для укрепления навыков и расширения понимания алгоритмов.
#обучение
@zen_of_python
Что такое линтер и что он делает
Линтер - это инструмент статического анализа кода, который проверяет ваш код на темы:
🔘 Синтаксис - правильно ли расставлены скобки, двоеточия;
🔘 Импорты - все ли импорты используются;
🔘 Переменные - все ли переменные определены;
🔘 Стиль - соответствие PEP 8;
🔘 Типы - если используется типизация.
Зачем запускать после изменений
⚡️ Обнаружение новых ошибок
# После добавления нового кода
def new_feature():
unused_var = "not used" # Линтер найдет неиспользуемую переменную
return "feature"
# После изменения импортов
from new_module import new_function
# Линтер проверит, существует ли new_function
# После рефакторинга
class MyClass:
def __init__(self):
self.very_long_attribute_name_that_should_be_shorter = None
# Линтер предложит сократить имя
import subprocess
user_input = input("Enter command: ")
subprocess.run(user_input, shell=True) # Линтер предупредит о SQL injection
# Неэффективно
my_list = []
for i in range(1000):
my_list.append(i)
# Линтер может предложить list comprehension
my_list = [i for i in range(1000)]
# pyproject.toml
[tool.ruff]
line-length = 88 # Максимальная длина строки
target-version = "py38" # Версия Python
[tool.ruff.lint]
select = ["E", "F", "W", "C90", "I", "N", "UP", "YTT", "S", "BLE", "FBT", "B", "A", "COM", "C4", "DTZ", "T10", "EM", "EXE", "FA", "ISC", "ICN", "G", "INP", "PIE", "T20", "PYI", "PT", "Q", "RSE", "RET", "SLF", "SLOT", "SIM", "TID", "TCH", "INT", "ARG", "PTH", "TD", "FIX", "ERA", "PD", "PGH", "PL", "TRY", "FLY", "NPY", "AIR", "PERF", "FURB", "LOG", "RUF"]
ignore = ["E501", "S101", "PLR0913", "PLR0912", "PLR0915"]
Лимитка для комьюнити выходит в прод! Успей залететь в розыгрыш
Уже скоро День программиста, и к этому моменту наш безалкогольный IPA будет разлит!
Вы выбрали название и концепт упаковки, а наши коллеги по коллабу из Paradox уже отдали этикетки в печать.
И пока мы с вами ожидаем релиза, запускаем специальный розыгрыш.
Победитель получит коробку «ТОКСИЧНЫЙ ПРОГРАММИСТ» с шестью банками. Подробнее с правилами вы можете ознакомиться здесь.
Для участия достаточно:
— быть подписанным на @tproger и @paradox_beer;
— оставить реакцию и любой комментарий под этим постом;
— нажать кнопку «Участвую».
Итоги подведём 15 сентября. Победителя выберем с помощью бота. Всем удачи!
Участников: 154
Призовых мест: 1
Дата розыгрыша: 18:00, 15.09.2025 MSK (3 дня)
Когда вынужден работать с несколькими версиями Python в своих проектах
#кек
@zen_of_python
Надо ещё добавить пару строк с комментами для количества
@ithumor
Всем тимлидам, разработчикам, тестировщикам и админам!
Счастливого Дня программиста!
Желаем вам всегда зелёных билдов, отзывчивых кластеров и тихих дежурных смен. Пусть ваши логи будут чисты от ошибок, а мониторинг предупреждает о проблемах раньше, чем о них узнают пользователи.
И чтобы пожелание точно сбылось, обязательно воспользуйтесь подарками из нашей IT-коробки. Готовили с любовью в сердце вместе с нашими друзьями.
С праздником!
alive-progress | Шкала прогресса в CLI
Библиотека, предназначенная для создания динамичных индикаторов прогресса в CLI. Среди фичей:
— плавная анимация спиннера;
— точный расчет оставшегося времени с использованием алгоритма экспоненциального сглаживания;
— хуки для логирования.
#инструмент #dataviz
@zen_of_python
Вопрос подписчика
Задает @mozmoroz:
«Какие платные курсы с куратором можете посоветовать по питону для получения базы знаний с пониманием что такое питон и цикл if? Возраст 15 лет»
NB! Пожалуйста, будьте взаимовежливы. Однажды и вам помогут в этой рубрике.
#обсуждение
@zen_of_python
Цепочка обязанностей
Цепочка обязанностей (Chain of Responsibility, CoR) — поведенческий паттерн, который пропускает запрос через последовательность обработчиков, пока один из них не возьмётся за дело (или пока цепочка не закончится). Этот подход «развязывает» отправителя и получателей запроса: отправителю не нужно знать, кто именно обработает задачу, а обработчики остаются взаимозаменяемыми и настраиваемыми в рантайме.
Используйте CoR, если:
🔘 обработка запроса может зависеть от набора условий/правил, которые меняются со временем;
🔘 нужно включать / выключать шаги обработки без переписывания вызвавшего кода;
🔘 часть запросов может обрабатываться на ранних шагах, а остальные — «прокатываться» дальше;
🔘 вы строите конвейер: фильтры, middleware, валидаторы, пост-обработчики.
Минимальный состав паттерна
🔘 Handler (интерфейс / абстракция): объявляет метод handle(request) и хранит ссылку на «следующего»;
🔘 ConcreteHandler: решает, обрабатывать ли запрос, либо передаёт дальше;
🔘 Client: строит цепочку и отправляет запрос первому звену.
Пример
Читать полностью…
from __future__ import annotations
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Optional, Any, Callable
class Handler(ABC):
def __init__(self, nxt: Optional["Handler"] = None):
self._next = nxt
def set_next(self, nxt: "Handler") -> "Handler":
self._next = nxt
return nxt # позволяет строить цепочку «в линию»
def handle(self, request: Any) -> Any:
# Базовая реализация: попытаться обработать здесь,
# иначе передать дальше.
result = self._handle_here(request)
if result is not None:
return result
if self._next:
return self._next.handle(request)
return None # никто не справился
@abstractmethod
def _handle_here(self, request: Any) -> Optional[Any]:
...
@dataclass
class HttpRequest:
path: str
headers: dict
user_id: Optional[int] = None
payload: Optional[dict] = None
class AuthHandler(Handler):
def _handle_here(self, req: HttpRequest) -> Optional[Any]:
token = req.headers.get("Authorization")
if not token:
# Нет токена — «решение на месте»: отклоняем и НЕ передаём дальше
return {"status": 401, "message": "Unauthorized"}
# валидируем (упростим) и ставим идентификатор
req.user_id = 42
return None # пропускаем дальше
class RateLimitHandler(Handler):
def __init__(self, check: Callable[[HttpRequest], bool], nxt: Optional[Handler] = None):
super().__init__(nxt)
self.check = check
def _handle_here(self, req: HttpRequest) -> Optional[Any]:
if not self.check(req):
return {"status": 429, "message": "Too Many Requests"}
return None
class RouterHandler(Handler):
def _handle_here(self, req: HttpRequest) -> Optional[Any]:
if req.path == "/me" and req.user_id:
return {"status": 200, "data": {"id": req.user_id}}
if req.path == "/ping":
return {"status": 200, "data": "pong"}
# Не мой маршрут — пропускаю дальше (если есть)
return None
class NotFoundHandler(Handler):
def _handle_here(self, req: HttpRequest) -> Optional[Any]:
# Терминальный обработчик: если дошли сюда — 404
return {"status": 404, "message": f"Route {req.path} not found"}
# Сборка цепочки
def build_pipeline() -> Handler:
auth = AuthHandler()
rate = RateLimitHandler(check=lambda r: True)
router = RouterHandler()
notfound = NotFoundHandler()
auth.set_next(rate).set_next(router).set_next(notfound)
return auth
if __name__ == "__main__":
pipeline = build_pipeline()
print(pipeline.handle(HttpRequest(path="/ping", headers={"Authorization": "Bearer x"})))
print(pipeline.handle(HttpRequest(path="/me", headers={"Authorization": "ok"})))
print(pipeline.handle(HttpRequest(path="/unknown", headers={"Authorization": "ok"})))
print(pipeline.handle(HttpRequest(path="/ping", headers={})))
AI Journey Contest 2025: Брось вызов задачам уровня профи в мире ИИ!
Участвуй в международном онлайн-соревновании по ИИ и получи возможность побороться за денежный приз! Призовой фонд — 6,5 млн рублей!
Выбери один или несколько треков:
• Agent-as-Judge — универсальный «судья», способный оценивать ИИ-тексты.
• Human-centered AI Assistant — персонализированный ассистент на основе
GigaChat, имитирующий поведение людей и способный предугадать их предпочтения.
Бонус: Участникам предоставляются токены для API + возможность получить дополнительно 1 млн токенов!
• GigaMemory — механизм долговременной памяти для LLM, помогающий ассистенту запоминать и использовать важные факты в диалоге.
Не упусти возможность не только прокачать свои скиллы, получить заветную строчку в списке своих достижений и выиграть солидный приз, но и заявить о себе на AI Journey — главной международной конференции по ИИ в России!
Соревнование проходит до 30 октября.
Регистрируйся и участвуй
Это #партнёрский пост
Как сеньоры документируют проекты: протокол архитектурных решений
В статье рассказывается, как сеньоры применяют ADR (Architectural Decision Record — протокол архитектурных решений), чтобы документировать важные архитектурные изменения, их причины и последствия. ADR помогает сохранять логику принятия решений, избегать повторений ошибок и облегчает командную работу, особенно для новых участников. Автор сравнивает такой протокол с «личным дневником, но для всей команды», подчеркивая его пользу в будущем: спустя время возвращаться к архитектурным мотивам становится гораздо проще.
#основы
@zen_of_python
💅 — Если применяешь такое
Шпаргалка NumPy
Удобная шпаргалка, чтобы основные функции и методы этой ключевой «вычисляющей» библиотеки были под рукой.
В ней собраны разделы вроде Creating Arrays, где показано, как создавать массивы разных типов и форм, Array Mathematics — с примерами арифметических операций, и Subsetting, Slicing, Indexing для работы с выборками. Есть также блоки про манипуляции с массивами, объединение, разбиение и сохранение данных.
#шпаргалка
@zen_of_python