20070
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL
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
crewAI | Оркестрируемые GPT
Зарубежные мечтатели неутомимо хотят слить всю работу на ИИ... На сей раз создали этакий «командный пост» для ваших нейронок вроде ChatGPT, Claude, Grok и прочих. Смысл в том, что доля портаков значительно сокращается, если LLM «судят» ответы друг друга. Даже вводят термин «гиперагент».
Тул добился звания «Репозиторий дня» на GitHub, а это уже немало!
Доступен в РФ: да
Цена: бесплатно
Google Gemini разочаровался в себе и... предложил заплатить разработчику за баг
Во время переписки ИИ от Google честно признался: «Мои знания устарели, я только мешаю». При этом он предложил пользователю оплатить услуги настоящего программиста для решения проблем.
Причиной стали вечные конфликты Vite, Tailwind и PostCSS, в которых Gemini окончательно запутался. Вместо решения — депрессия и предложение нанять «кожаного программиста».
Ну что, работяги — можем спать спокойно? Никакой ИИ нас пока что не заменит
@your_tech
Вопросы подписчиков
Zen of Python поддерживает новоприбывших (и не только) в особой рубрике. Как это работает:
— Спрашивайте что угодно (в комментариях под этим постом), связанное с Python. Здесь нет плохих вопросов!
— Сообщество вас поддержит. Самые интересные вопросы мы разберём в отдельном посте.
#обсуждение
@zen_of_python
job-hunter | Для цифровых кочевников
Один энтузиаст создал трекер вакансий на удаленке, который ищет среди работных сайтов вроде GitHub, WorkingNomads и Remote.io подходящие объявления и высылает находки Telegram-ботом. Есть фильтрация по тегам. Если вам хочется поупражняться — форкайте и дописывайте под HH.
#пет-проект
@zen_of_python
Переменные окружения: введение
Переменные окружения — это данные, хранящиеся вне программы, которые могут влиять на её поведение. Например, ключ API или пароли, указанные в коде, будут доступны только при выполнении программы — и не попадут в публичный репозиторий. Такое хранение существенно повышает безопасность «переносимого» проекта.
Встроенный модуль os
Простейший способ обратиться к средовой переменной в коде — os.environ:
import os
print(os.environ) # Вывести все переменные
val = os.environ['USER'] # Бросит KeyError, если нет
val = os.getenv('USER')
# .env
API_KEY=abcdef
DB_URL=postgres://...
from dotenv import load_dotenv
import os
load_dotenv() # загрузка из .env
api_key = os.getenv('API_KEY')
export API_KEY="abcdef"
export API_SECRET="12345"
set API_KEY=abcdef
set API_SECRET=12345
pip install python-dotenv. И теперь функция считает все переменные, каким бы способом они ни были объявлены:
from dotenv import load_dotenv
load_dotenv()
Как тестировать перенос и трансформацию данных без боли
В статье на Tproger представили практичный и понятный подход к тестированию ETL-процессов с использованием Python, Pytest и фикстур. Автор — Data QA, поделилась опытом автоматизации создания и наполнения таблиц, хранением схем и данных в JSON, а также сравнением результатов до и после трансформации.
Проект с минимальным стеком — pytest, allure и psycopg2. Статья будет полезна разработчикам и тестировщикам.
#основы
@zen_of_python
tabulate | pretty-printed-таблицы в CLI
Библиотека сделает вывод датафрейма в консоль красивой. Поддерживает множество типов итерируемых объектов, может стилизовать вывод под GitHub, PSQL, LaTeX, Jira и проч. Самое оно для красоты в Google Colab.
#инструмент
@zen_of_python
archivey | WinRAR больше не нужен
Библиотека предлагает унифицированный способ обращения с архивами .zip, .rar, .tar, .7z и другими форматами. Массовые создание и распаковка, обработка символических ссылок (symlink), управление правами доступа и паролями.
#инструмент
@zen_of_python
По результатам опроса Python Software Foundation, в 2025 году, доля разработчиков, использующих FastAPI, выросла с 29 до 38%.
#кек
@zen_of_python
Requests для начинающих + пара фишек для адептов
requests является де-факто стандартом для HTTP-запросов в Python. Она упрощает взаимодействие с веб-сервисами, предоставляя интуитивно понятный интерфейс для отправки запросов и обработки ответов.
Инструмент не входит в стандартную библиотеку ЯП, поэтому его необходимо установить отдельно:
python -m pip install requests
GET:
import requests
response = requests.get('https://example.com')
print(response.text)
POST:
import requests
data = {'key': 'value'}
response = requests.post('https://example.com', data=data)
print(response.text)
print(response.status_code) # 200 — успешный запрос
json():
data = response.json()
params = {'q': 'python'}
response = requests.get('https://example.com/search', params=params)
headers:
headers = {'User-Agent': 'my-app'}
response = requests.get('https://example.com', headers=headers)
from requests import Request, Session
req = Request('GET', 'https://example.com', params={'q': 'python'})
prepared = req.prepare()
with Session() as session:
response = session.send(prepared)
print(response.text)
auth:
from requests.auth import HTTPBasicAuth
response = requests.get('https://example.com', auth=HTTPBasicAuth('user', 'pass'))
verify:
response = requests.get('https://example.com', verify=False)
with requests.Session() as session:
response = session.get('https://example.com')
print(response.text)
urllib3 вместе с Requests.
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
Придумайте подпись к видео так, чтобы это относилось к Python-разработке
#обсуждение
@zen_of_python
Зацените как похорошели транскрибации при Войси!
Вайб-кодинг вайб-кодингом, но как же не хватает простого человеческого «расшифруй мне созвон, только качественно!!». С этим вам поможет Войси.
🤯Этот ИИ-агент может с легкостью сделать из созвона текст, подвести итоги встречи и составить саммари. Войси переводит с 54 языков на русский без всяких артефактов и составляет текст в аккуратные абзацы с выделенными тезисами.
Самое удобное, что далеко ходить не надо — всё это делается прямо в «телеге». Экономьте своё время, превращая часы в минуты.
🔥А новичкам доступны 1,5 часа бесплатной транскрибации. Забирайте: https://tprg.ru/9xQo
opendota2-vision | Ищем «смурфов» в Dota
Энтузиаст запилил проект на pytesseract, pillow, который находит в Dota2 «смурфов» — опытных игроков, которые создают новый аккаунт с низким рейтингом, чтобы играть против менее сильных соперников. Их цель — играть на «низком» уровне, где он явно сильнее большинства игроков, выигрывать легко и, как правило, доминировать в матчах.
#пет_проект
@zen_of_python
Как динамически изменять исходный код функций
В статье «Wicked Python Trickery» Эрик Ма делится необычным и мощным методом динамической модификации исходного кода функций во время выполнения программы.
Что за трюк?
В Python каждая функция имеет атрибут .__code__, который представляет собой объект байткода. Используя функции compile() и exec(), можно создать новый исходный код функции, скомпилировать его в байткод и выполнить в нужном пространстве имён. Это позволяет заменить поведение функции без её явного переопределения:
def something():
raise NotImplementedError()
new_code = """
def something(x: int) -> int:
return x * 2
"""
compiled = compile(new_code, "<magic>", "exec")
ns = {}
exec(compiled, {}, ns)
something_new = ns["something"]
print(something_new(21)) # Выведет 42
something, компилируем его и выполняем в пустом пространстве имён. Затем извлекаем новую функцию из этого пространства и вызываем её.
Про withwith позволяет обернуть выполнение блока кода в так называемый контекстный менеджер, который автоматически управляет ресурсами. Это особенно полезно для операций, требующих явного освобождения ресурсов, таких как работа с файлами, сетевыми соединениями или базами данных:
with open('example.txt', 'r') as file:
content = file.read()
print(content)
__enter__(): выполняется при входе в блок with. Готовит ресурс и возвращает его;__exit__(): выполняется при выходе из блока. Отвечает за очистку ресурса, например, закрытие файла.
import sqlite3
with sqlite3.connect('example.db') as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
try / finally;
Функции vs. метод в Python: разница
Тем, кто в языке первый год, разница между этими объектами может показаться неочевидной, для них и написан этот лонгрид.
Что такое функция?
Это блок кода, который принимает входные данные (аргументы), обрабатывает их и возвращает результат. Выделяют два типа:
1️⃣ без побочных эффектов — это чисто математические функции;
2️⃣ с побочными эффектами — функции, которые взаимодействуют с чем-то вне себя, например, с файлом, списком, базой данных или терминалом.
Пример чистой функции
def add(a, b):
return a + b
print(add(2, 3)) # Всегда возвращает 5
import random
def random_point():
x = random.randint(0, 10)
y = random.randint(0, 10)
return x, y
print(random_point()) # Каждый раз возвращает разные значения
random, и результат может меняться при каждом вызове. Это и есть побочный эффект.set_name — это метод, используемый только для объектов Employee:
class Employee:
def set_name(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
# Создаём объекты
emp1 = Employee()
emp2 = Employee()
# Используем метод
emp1.set_name("Alice", "Smith")
emp2.set_name("Bob", "Brown")
print(emp1.first_name, emp1.last_name) # Alice Smith
print(emp2.first_name, emp2.last_name) # Bob Brown
И не дай Бог, pdb (Python Debugger)
#кек
@zen_of_python
Питонистам позалипать на вечер: вышла документалка про Python 🖥
История о том, как скромный проект из Амстердама 90-х превратился в движок для AI, дата-сайенса и топовых IT-компаний. За 90 минут документалка охватывает всё: первые коммиты, сомнения в будущем, почти забвение — и путь к славе.
В фильме — интервью с Гвидо ван Россумом, Трэвисом Олифантом (создатель NumPy), Барри Варшавом и другими ведущими разработчиками. Они делятся закулисьем жизни Python, моментами разногласий и тем, как язык стал незаменимым… ну, реально для всего.
Еще одна схема мошенничества на PyPi: освободившиеся домены
PyPI усиливает защиту аккаунтов от атак через «возрождение» доменов. С июня 2025 года система ежедневно проверяет статус доменов, связанных с адресами электронной почты пользователей. Если домен переходит в период восстановления или удаления, PyPI автоматически отменяет верификацию таких адресов, предотвращая возможность захвата аккаунта через сброс пароля. С начала июня более 1 800 адресов были размечены как ненадежные. Пользователям рекомендуется добавить вторичный адрес с надежного почтового сервиса и включить двухфакторную аутентификацию для повышения безопасности.
#безопасность
@zen_of_python
😈 — Если для мошенников в опенсорсе отдельный котел в аду