Zen of Python
20.1K subscribers
1.26K photos
170 videos
33 files
3.23K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
Переменные окружения: введение

Переменные окружения — это данные, хранящиеся вне программы, которые могут влиять на её поведение. Например, ключ API или пароли, указанные в коде, будут доступны только при выполнении программы — и не попадут в публичный репозиторий. Такое хранение существенно повышает безопасность «переносимого» проекта.


Встроенный модуль os

Простейший способ обратиться к средовой переменной в коде — os.environ:


import os
print(os.environ) # Вывести все переменные
val = os.environ['USER'] # Бросит KeyError, если нет
val = os.getenv('USER')



.env и python-dotenv

Общепринятая практика — хранить конфигурацию в файле .env и загружать переменные при старте скрипта:


# .env
API_KEY=abcdef
DB_URL=postgres://...



from dotenv import load_dotenv
import os

load_dotenv() # загрузка из .env
api_key = os.getenv('API_KEY')


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


Без .env

Порой для простых проектов проще вообще не создавать файлов .env, можно экспортировать в виртуальное окружение переменную сразу. Как это делается в Unix или macOS:


export API_KEY="abcdef"
export API_SECRET="12345"


В Windows CMD:


set API_KEY=abcdef
set API_SECRET=12345



load_dotenv

Еще один удобный способ «вчитаться» во все средовые переменные в коде — функция load_dotenv().

Для нее потребуется установить библиотеку: pip install python-dotenv. И теперь функция считает все переменные, каким бы способом они ни были объявлены:


from dotenv import load_dotenv
load_dotenv()


#основы
@zen_of_python
42
opendota2-vision | Ищем «смурфов» в Dota

Энтузиаст запилил проект на pytesseract, pillow, который находит в Dota2 «смурфов» — опытных игроков, которые создают новый аккаунт с низким рейтингом, чтобы играть против менее сильных соперников. Их цель — играть на «низком» уровне, где он явно сильнее большинства игроков, выигрывать легко и, как правило, доминировать в матчах.

#пет_проект
@zen_of_python
🤪3👍1🆒1
​​job-hunter | Для цифровых кочевников

Один энтузиаст создал трекер вакансий на удаленке, который ищет среди работных сайтов вроде GitHub, WorkingNomads и Remote.io подходящие объявления и высылает находки Telegram-ботом. Есть фильтрация по тегам. Если вам хочется поупражняться — форкайте и дописывайте под HH.

#пет-проект
@zen_of_python
👍2🍌1
Зацените как похорошели транскрибации при Войси!

Вайб-кодинг вайб-кодингом, но как же не хватает простого человеческого «расшифруй мне созвон, только качественно!!». С этим вам поможет Войси.

🤯Этот ИИ-агент может с легкостью сделать из созвона текст, подвести итоги встречи и составить саммари. Войси переводит с 54 языков на русский без всяких артефактов и составляет текст в аккуратные абзацы с выделенными тезисами.

Самое удобное, что далеко ходить не надо — всё это делается прямо в «телеге». Экономьте своё время, превращая часы в минуты.

🔥А новичкам доступны 1,5 часа бесплатной транскрибации. Забирайте: https://tprg.ru/9xQo
👎1
Вопросы подписчиков

Zen of Python поддерживает новоприбывших (и не только) в особой рубрике. Как это работает:

— Спрашивайте что угодно (в комментариях под этим постом), связанное с Python. Здесь нет плохих вопросов!
— Сообщество вас поддержит. Самые интересные вопросы мы разберём в отдельном посте.

#обсуждение
@zen_of_python
3
This media is not supported in your browser
VIEW IN TELEGRAM
Придумайте подпись к видео так, чтобы это относилось к Python-разработке

#обсуждение
@zen_of_python
😁2👀1
Google Gemini разочаровался в себе и... предложил заплатить разработчику за баг

Во время переписки ИИ от Google честно признался: «Мои знания устарели, я только мешаю». При этом он предложил пользователю оплатить услуги настоящего программиста для решения проблем.

Причиной стали вечные конфликты Vite, Tailwind и PostCSS, в которых Gemini окончательно запутался. Вместо решения — депрессия и предложение нанять «кожаного программиста».

Ну что, работяги — можем спать спокойно? Никакой ИИ нас пока что не заменит

@your_tech
😢12😁72
😁213😈1
​​crewAI | Оркестрируемые GPT

Зарубежные мечтатели неутомимо хотят слить всю работу на ИИ... На сей раз создали этакий «командный пост» для ваших нейронок вроде ChatGPT, Claude, Grok и прочих. Смысл в том, что доля портаков значительно сокращается, если LLM «судят» ответы друг друга. Даже вводят термин «гиперагент».

Тул добился звания «Репозиторий дня» на GitHub, а это уже немало!

Доступен в РФ: да
Цена: бесплатно
👍31
Google Image Scraper | Массовый парсинг картинок из Google

Тул помогает собирать сотни изображений для любой вашей цель — будь то ML-датасет, дизайн или что-то еще. При запуске указываем ключевые слова, количество файлов и параметры — и скрипт автоматически выгрузит нужные фото в нужном разрешении. Поддерживает работу в headless-режиме, гибкую настройку качества и параллельные загрузки.

Цена: бесплатно
#инструмент
@zen_of_python
1👍1
Шпаргалка NumPy.pdf
649.4 KB
Шпаргалка NumPy

Удобная шпаргалка, чтобы основные функции и методы этой ключевой «вычисляющей» библиотеки были под рукой.

В ней собраны разделы вроде Creating Arrays, где показано, как создавать массивы разных типов и форм, Array Mathematics — с примерами арифметических операций, и Subsetting, Slicing, Indexing для работы с выборками. Есть также блоки про манипуляции с массивами, объединение, разбиение и сохранение данных.

#шпаргалка
@zen_of_python
🔥3
Самое время собрать свою команду из 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 сентября!

А больше новостей и подробностей — на нашем канале, подписывайтесь.

Это #партнёрский пост
Please open Telegram to view this post
VIEW IN TELEGRAM
1🌭1
​​Как сеньоры документируют проекты: протокол архитектурных решений

В статье рассказывается, как сеньоры применяют ADR (Architectural Decision Record — протокол архитектурных решений), чтобы документировать важные архитектурные изменения, их причины и последствия. ADR помогает сохранять логику принятия решений, избегать повторений ошибок и облегчает командную работу, особенно для новых участников. Автор сравнивает такой протокол с «личным дневником, но для всей команды», подчеркивая его пользу в будущем: спустя время возвращаться к архитектурным мотивам становится гораздо проще.

#основы
@zen_of_python
💅 — Если применяешь такое
31💅1
Вопрос подписчика

Задает @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))

Что ещё можно ускорить?»

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

#обсуждение
@zen_of_python
AI Journey Contest 2025: Брось вызов задачам уровня профи в мире ИИ!
 
Участвуй в международном онлайн-соревновании по ИИ и получи возможность побороться за денежный приз! Призовой фонд — 6,5 млн рублей!
 
Выбери один или несколько треков:
• Agent-as-Judge — универсальный «судья», способный оценивать ИИ-тексты.
 
• Human-centered AI Assistant — персонализированный ассистент на основе
GigaChat, имитирующий поведение людей и способный предугадать их предпочтения.
Бонус: Участникам предоставляются токены для API + возможность получить дополнительно 1 млн токенов!
 
• GigaMemory — механизм долговременной памяти для LLM, помогающий ассистенту запоминать и использовать важные факты в диалоге.
 
Не упусти возможность не только прокачать свои скиллы, получить заветную строчку в списке своих достижений и выиграть солидный приз, но и заявить о себе на AI Journey — главной международной конференции по ИИ в России!
 
Соревнование проходит до 30 октября.
Регистрируйся и участвуй

Это #партнёрский пост
👍1
Forwarded from Типичный программист
This media is not supported in your browser
VIEW IN TELEGRAM
CodeViz: бесплатное дополнение для VS Code, превращающее код в интерактивную карту 😬

Плагин строит визуальную структурированную карту вашего кода прямо в IDE. Можно наглядно увидеть архитектуру проекта, связи между файлами и понять его суть.

Поддерживается масса яп, всё работает быстро и абсолютно бесплатно. Сохраняйте.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥81
Цепочка обязанностей

Цепочка обязанностей (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={})))
Please open Telegram to view this post
VIEW IN TELEGRAM
Этот код демонстрирует:
🔘 короткое замыкание (401 и 429 останавливают конвейер);
🔘 прохождение запроса дальше при None;
🔘 терминальный обработчик 404.


Политики прохождения запроса

🔘 Short-circuit (рекомендуется по умолчанию): первый, кто вернул результат, «закрывает» цепочку;
🔘 Fall-through: все обработчики обязаны отработать (например, аудит/метрики/логирование), результат — агрегация;
🔘 Микс: часть «жёстких» (аутентификация, лимиты) — short-circuit; «мягкие» (логирование) — всегда проходят.

#основы
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
Альфа-Банк приглашает IT-специалистов на турнир по спортивному хакингу AlfaCTF — он пройдёт 13-14 сентября

Разработчики, тестировщики и аналитики будут решать таски: взламывать, находить уязвимости, собирать флаги и бороться за звание лучшего хакера.

🤓🤓🤓🤓🤓🤓🤓🤓
🤓🤓🤓🤓🤓🤓🤓🤓
🤓🤓🤓🤓🤓🤓🤓🤓
🤓🤓🤓🤓🤓🤓🤓🤓
🤓🤓🤓🤓🤓🤓🤓🤓
🤓🤓🤓🤓🤓🤓🤓🤓
🤓🤓🤓🤓🤓🤓🤓🤓

Всего три уровня сложности, есть и простой для студентов. Команды-победители получат до 450 тысяч рублей. Собрать команду и зарегаться нужно на сайте. Для разминки найдите баг на картинке:

Это #партнёрский пост
Please open Telegram to view this post
VIEW IN TELEGRAM
👎411
​​Вопрос подписчика

Задает @mozmoroz:

«Какие платные курсы с куратором можете посоветовать по питону для получения базы знаний с пониманием что такое питон и цикл if? Возраст 15 лет»

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

#обсуждение
@zen_of_python
1