PythonTalk
4.74K subscribers
1.44K photos
47 videos
7 files
1.3K links
Привет, меня зовут Олег Булыгин 👋

🐍 Здесь я делюсь полезной информацией для тех, кто пишет код на Python: от разработки до Data Science.

По вопросам: @obulygin91
Download Telegram
Недавно The New York Times выпустила материал с говорящим заголовком «Goodbye, $165,000 Tech Jobs. Student Coders Seek Work at Chipotle».

Суть, если коротко: золотая лихорадка для джунов в США закончилась. Обещания про «выучи код и будешь получать шестизначную зарплату на старте», на которых выросло целое поколение, разбились о суровую реальность 2025 года.

Несколько фактов из статьи:
- Парень по имени Зак Тейлор с дипломом computer science подал заявки на 5762 вакансии. Результат: 13 собесов, 0 офферов.
- Девушка Манаси Мишра, отучившись на программиста, единственное интервью получила в сети фастфуда Chipotle.
- Уровень безработицы среди свежих выпускников CS — 6.1-7.5%. Это вдвое выше, чем у выпускников с дипломом по биологии или истории искусств. Истории искусств, Карл!

Винят в этом две вещи:
1️⃣ Массовые увольнения в бигтехах, которые перегрели рынок.
2️⃣ Распространение ИИ-инструментов, которые автоматизируют как раз ту самую работу начального уровня, на которую раньше брали джунов.

Более того, статья описывает «ИИ-петлю обреченности» (AI doom loop): соискатели используют ИИ, чтобы массово рассылать сотни резюме, а компании используют ИИ, чтобы так же массово их отсеивать. Выхлоп — нулевой. Нейронки собеседуют нейронки, а человек в этой схеме — лишний. Все как в образовании 😂

Девушка из статьи, Манаси, работу в итоге нашла. Не программистом. А в технических продажах, куда пробилась благодаря своему TikTok-аккаунту.

До нас такие тренды доходят всегда с опозданием. Или нет? 😄
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚3😢2👨‍💻111
Утиная типизация в Python 🦆

"Если это выглядит как утка и крякает как утка..." – принцип знаком многим. Он позволяет писать более обобщенный код, не привязываясь к конкретным классам. Однако, без чётких "правил игры", она может приводить к ошибкам во время выполнения.

К счастью, Python предлагает механизмы для более явного определения интерфейсов: Абстрактные Базовые Классы (ABC) и typing.Protocol. Они помогают структурировать код и делают его поведение предсказуемее.

Знакомимся со всем этим в карточках!
🔥9👍5311🙏1🆒1
📕 OpenAI выкатила гайд по написанию промптов в задачах программирования для GPT-5.

Вот 6 главных правил:

1️⃣ Хватит «лить воду». GPT-5 стала в разы лучше следовать инструкциям. Обратная сторона: любая расплывчатость или конфликт в промпте будут ухудшать качество.

2️⃣ Правильно выбирайте «усилие». У модели теперь есть уровни «глубины мышления» (reasoning effort). Для сложных задач включаем high, для простых — low или medium. Иначе она начнёт овер-инжинирить калькулятор и писать для него микросервисную архитектуру.

3️⃣ Говорите на языке XML. Чтобы модель не запуталась в контексте, ей нужно его структурировать. Оборачивайте правила, гайдлайны и примеры в XML-подобные теги (<code_editing_rules>, <persistence>).

4️⃣ Не будьте слишком настойчивы. Команды в стиле «Будь МАКСИМАЛЬНО тщательным!» или «Убедись, что у тебя ПОЛНАЯ картина!» теперь вредят. Модель и так стремится к дотошности, и такие приказы заставляют её уходить в параноидальный режим сбора контекста.

5️⃣ Дайте ей «подумать». Для реально сложных задач (типа «напиши мне приложение с нуля») нужно давать инструкции для саморефлексии. Буквально заставлять её сначала продумать план и критерии успеха (<self_reflection>), а потом уже писать код.

6️⃣ Держите агента на поводке. По умолчанию GPT-5 рвётся в бой и пытается сделать всё и сразу. Её «рвение» нужно контролировать: задавать бюджет на использование инструментов и чётко прописывать, когда можно действовать самостоятельно, а когда — спрашивать человека.

А вы как пишите промпты? 👇🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥2🙏11
Помните, недавно щупали Matrix-Game 2.0 — нейронку, которая строит мир по нажатию клавиш? Так вот, забудьте. На ринг вышел тяжеловес 🥊

Tencent (да, те самые, что делают PUBG) выкатили Hunyuan-GameCraft — опенсорсный фреймворк на Python для генерации интерактивных игровых миров.

- Память как у слона: Модель помнит сцену и не разваливается после пары поворотов, в отличие от многих предшественников.
- Обучена на AAA-играх: Ее натаскали на миллионе геймплейных роликов из 100+ топовых игр. Она знает, что такое "красиво" и "динамично".
- Ускоренная версия: Есть дистиллированная модель, которая генерит кадры в разы быстрее, приближаясь к реальному времени.

Вот вам статейка с инструкцией по запуску и кратким анализом архитектуры: Hunyuan-GameCraft: Запускаем процедурный игровой мир от Tencent 🔙🔙

Как думаете, сколько лет осталось до игр с полностью генерируемыми мирами, в которые можно будет полноценно играть? Год? Три? Пять? 👇

#щупаем_сорцы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🔥11
🐍 Алгоритмическая задачка: Прыжки Квантовой Блохи

Представьте себе очень энергичную, но немного дезориентированную квантовую блоху. Она сидит на бесконечной числовой линейке и хочет добраться из одной точки в другую.

Проблема в том, что она должна сделать ровно определенное количество прыжков. Не больше и не меньше!

Условие 🎯
Вам даны три положительных целых числа:
- start_pos — начальная позиция блохи.
-
end_pos — конечная цель.
- k — точное количество прыжков, которое она должна совершить.

За один прыжок блоха может переместиться либо на одну позицию влево (-1), либо вправо (+1).

Ваша задача — написать функцию, которая вернет количество различных последовательностей прыжков, которые приведут блоху из start_pos в end_pos ровно за k шагов.

Примеры 👇

Пример 1:
start_pos = 1
end_pos = 2
k = 3

Результат: 3

💡 Почему? Есть ровно три уникальных маршрута:
- 1 -> 2 -> 3 -> 2 (вправо, вправо, влево)
- 1 -> 2 -> 1 -> 2 (вправо, влево, вправо)
- 1 -> 0 -> 1 -> 2 (влево, вправо, вправо)

Пример 2:
start_pos = 2
end_pos = 5
k = 10

Результат: 0

💡 Почему? Невозможно добраться до 5 из 2 за 10 шагов. Минимально нужно 3 шага. Оставшиеся 7 шагов (нечетное число) нельзя потратить на пары "туда-обратно", которые компенсируют друг друга.


Жду ваши решения в комментариях! 👇
🔥3🤔2🤯11
Из забавного: изучал по каким запросам выводятся статьи на моем сайте.

Есть перлы, конечно 😅

Сколько боли в этом запросе 👨‍💻

#хих
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1322🤣1🙈1
Война DRY, KISS и YAGNI ⚔️⚔️

Тебя научили этим трем принципам. Сказали, что это база.

Но тебе не рассказали главного: они постоянно воюют друг с другом.

Профессионализм — это не следовать этим правилам, а осознанно выбирать, какое из них предать в каждой конкретной ситуации.

📖Читать, как выбрать, какой из принципов предать →
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
9🔥4👍3🙏1
@xom9IKC напомнил про хорошую рекомендацию 🎓

У Яндекса есть неплохая подборка хэндбуков по it-тематикам, причём не только для начинающих. Посмотреть всё можно здесь.

Что есть сейчас:
🔸 Основы Python
🔸 Основы C++
🔸 Машинное обучение
🔸 Основы алгоритмов
🔸 Математика для анализа данных
🔸 Flutter

Внутри — теория, задачки с автопроверкой и примеры. Я даже сам иногда туда заглядываю, когда готовлю материалы для своих курсов 🌝

Это, конечно, не заменит полноценный курс с наставником и комьюнити, но как бесплатный тренажёр или справочник — топ.
73👍3🔥21🙏1🆒11
🧑‍💻 Сегодня в роли патологоанатома. На операционном столе — репозиторий с 14 играми на Python.

Наткнулся на GitHub-сборник классики: Pacman, Tetris, Flappy Bird... всё на Python. С одной стороны — респект автору, всё работает. С другой — это идеальный пример, набитый классическими «болячками», на которых можно учиться.

Давайте препарируем пару самых интересных случаев. Не для критики, а для образовательных целей. Чем работающий код отличается от хорошего?

Пациент №1: Шашки и порочный круг импортов.

В коде есть классы Piece, Pawn и King. Пешка (Pawn) может стать королем (King). Оба наследуются от Piece. И чтобы превратить пешку в короля, автор делает вот так внутри метода класса Piece:

# Checkers/Piece.py
def _move(self, tile):
# ...
if self.notation == 'p':
if self.y == 0 or self.y == 7:
from King import King # <--- АТАС!
tile.occupying_piece = King(...)

Диагноз: Импорт внутри метода! Так автор обошел циклическую зависимость (Piece импортирует King, а King импортирует Piece). Это симптом больной архитектуры. Фигура не должна знать о правилах своей "прокачки".

Лечение: Делегировать! Класс Board (доска) должен управлять правилами. Метод _move просто возвращает True, а уже Board проверяет, не пора ли пешке стать королем, и создает новый объект King. Так мы разрываем порочную связь.

Пациент №2: Flappy Bird и суп из глобальных переменных 🐤

# Flappy Bird/game.py
window_width = 600
#...
pipeVelX = -4
bird_velocity_y = -9
birdAccY = 1


Диагноз: Классика. Глобальные переменные и «магические числа». Что такое -4? Что такое 1? Через неделю сам автор забудет. Менять баланс игры — адская боль, нужно выискивать эти цифры по всему коду.

Лечение:
1. Все константы — в отдельный класс GameConfig.
2. Всю логику и состояние (score, bird_velocity_y) — внутрь класса FlappyBirdGame и его атрибутов (self.score).

И вот так работающий код превращается в хороший. Разница — в архитектуре и подходе.

Разобрал еще 4 типовые ошибки из этого репо (управление ресурсами, смешение логики и отображения и др.) в статье с примерами.

👉 Читать про 6 ошибок новичка

А какие «костыли» из этого списка вы сами городили в начале пути? Признавайтесь 👇🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥211
💡 Разбор задачи про прыжки квантовой блохи

1️⃣ Хорошее решение: инженерный подход (DP + кэш)

Решение через динамическое программирование с мемоизацией — очень хороший вариант. Выглядит он примерно так:

from functools import cache

def count_dp(start_pos, end_pos, k):
@cache
def dp(p, s):
# Базовый случай: шаги кончились
if s == 0:
return 1 if p == end_pos else 0

# Рекурсивный шаг: прыгаем влево и вправо
return dp(p - 1, s - 1) + dp(p + 1, s - 1)

return dp(start_pos, k)


Мы рекурсивно исследуем все пути, а декоратор @cache спасает нас от повторных вычислений для одних и тех же состояний (позиция, оставшиеся шаги). Классика, которая точно сработает на собеседовании. Но можно ли лучше?

Спойлер: можно.

2️⃣ Идеальное решение: комбинаторика

А что, если я скажу, что эту задачу можно решить одной формулой, без всяких рекурсий и DP? 😏

Вся магия кроется в комбинаторике. Давайте рассуждать:
- Пусть R — количество шагов вправо, а L — количество шагов влево.
- Очевидно, что общее число шагов R + L = k.
- Итоговая позиция: start_pos + R - L = end_pos, откуда R - L = end_pos - start_pos.

У нас есть система из двух линейных уравнений. Решив её, мы легко найдем, что R = (k + end_pos - start_pos) / 2.

И тут всё превращается в классическую задачу из комбинаторики:
Сколькими способами можно выбрать R шагов "вправо" из k общих шагов?


А это — биномиальный коэффициент, или C(k, R). В Python 3.8+ для этого есть готовая функция math.comb.

Сначала пара проверок на адекватность:
1. Разница в позициях abs(start_pos - end_pos) не может быть больше k.
2. Чётность должна совпадать: (k - abs(start_pos - end_pos)) % 2 == 0. Если разница нечётная, то и шагов должно быть нечётное кол-во (и наоборот).

Итоговый код:
import math

def count_math(start_pos, end_pos, k):
dist = end_pos - start_pos

if abs(dist) > k or (k - dist) % 2 != 0:
return 0

# Находим число шагов вправо
r = (k + dist) // 2

# Считаем C(k, r)
return math.comb(k, r)


Итог: вместо потенциально медленного DP со сложностью O(k * dist) мы получаем решение за O(1) (если считать math.comb быстрым для разумных k).

Вот она, сила математики! 🧠

#алгособес
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6111