Утиная типизация в Python 🦆
"Если это выглядит как утка и крякает как утка..." – принцип знаком многим. Он позволяет писать более обобщенный код, не привязываясь к конкретным классам. Однако, без чётких "правил игры", она может приводить к ошибкам во время выполнения.
К счастью, Python предлагает механизмы для более явного определения интерфейсов: Абстрактные Базовые Классы (ABC) и
Знакомимся со всем этим в карточках!
"Если это выглядит как утка и крякает как утка..." – принцип знаком многим. Он позволяет писать более обобщенный код, не привязываясь к конкретным классам. Однако, без чётких "правил игры", она может приводить к ошибкам во время выполнения.
К счастью, Python предлагает механизмы для более явного определения интерфейсов: Абстрактные Базовые Классы (ABC) и
typing.Protocol
. Они помогают структурировать код и делают его поведение предсказуемее. Знакомимся со всем этим в карточках!
🔥8👍4 3⚡1❤1🙏1🆒1
Вот 6 главных правил:
high
, для простых — low
или medium
. Иначе она начнёт овер-инжинирить калькулятор и писать для него микросервисную архитектуру.<code_editing_rules>
, <persistence>
). <self_reflection>
), а потом уже писать код.А вы как пишите промпты? 👇🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥2🙏1 1
Помните, недавно щупали Matrix-Game 2.0 — нейронку, которая строит мир по нажатию клавиш? Так вот, забудьте. На ринг вышел тяжеловес 🥊
Tencent (да, те самые, что делают PUBG) выкатили Hunyuan-GameCraft — опенсорсный фреймворк на Python для генерации интерактивных игровых миров.
- Память как у слона: Модель помнит сцену и не разваливается после пары поворотов, в отличие от многих предшественников.
- Обучена на AAA-играх: Ее натаскали на миллионе геймплейных роликов из 100+ топовых игр. Она знает, что такое "красиво" и "динамично".
- Ускоренная версия: Есть дистиллированная модель, которая генерит кадры в разы быстрее, приближаясь к реальному времени.
Вот вам статейка с инструкцией по запуску и кратким анализом архитектуры: Hunyuan-GameCraft: Запускаем процедурный игровой мир от Tencent🔙 🔙
Как думаете, сколько лет осталось до игр с полностью генерируемыми мирами, в которые можно будет полноценно играть? Год? Три? Пять? 👇
#щупаем_сорцы
Tencent (да, те самые, что делают PUBG) выкатили Hunyuan-GameCraft — опенсорсный фреймворк на Python для генерации интерактивных игровых миров.
- Память как у слона: Модель помнит сцену и не разваливается после пары поворотов, в отличие от многих предшественников.
- Обучена на AAA-играх: Ее натаскали на миллионе геймплейных роликов из 100+ топовых игр. Она знает, что такое "красиво" и "динамично".
- Ускоренная версия: Есть дистиллированная модель, которая генерит кадры в разы быстрее, приближаясь к реальному времени.
Вот вам статейка с инструкцией по запуску и кратким анализом архитектуры: Hunyuan-GameCraft: Запускаем процедурный игровой мир от Tencent
Как думаете, сколько лет осталось до игр с полностью генерируемыми мирами, в которые можно будет полноценно играть? Год? Три? Пять? 👇
#щупаем_сорцы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2🔥1 1
🐍 Алгоритмическая задачка: Прыжки Квантовой Блохи
Представьте себе очень энергичную, но немного дезориентированную квантовую блоху. Она сидит на бесконечной числовой линейке и хочет добраться из одной точки в другую.
Проблема в том, что она должна сделать ровно определенное количество прыжков. Не больше и не меньше!
Условие 🎯
Вам даны три положительных целых числа:
-
-
-
За один прыжок блоха может переместиться либо на одну позицию влево (-1), либо вправо (+1).
Ваша задача — написать функцию, которая вернет количество различных последовательностей прыжков, которые приведут блоху из
Примеры 👇
Пример 1:
Результат: 3
💡 Почему? Есть ровно три уникальных маршрута:
- 1 -> 2 -> 3 -> 2 (вправо, вправо, влево)
- 1 -> 2 -> 1 -> 2 (вправо, влево, вправо)
- 1 -> 0 -> 1 -> 2 (влево, вправо, вправо)
Пример 2:
Результат: 0
💡 Почему? Невозможно добраться до 5 из 2 за 10 шагов. Минимально нужно 3 шага. Оставшиеся 7 шагов (нечетное число) нельзя потратить на пары "туда-обратно", которые компенсируют друг друга.
Жду ваши решения в комментариях! 👇
Представьте себе очень энергичную, но немного дезориентированную квантовую блоху. Она сидит на бесконечной числовой линейке и хочет добраться из одной точки в другую.
Проблема в том, что она должна сделать ровно определенное количество прыжков. Не больше и не меньше!
Условие 🎯
Вам даны три положительных целых числа:
-
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 шагов (нечетное число) нельзя потратить на пары "туда-обратно", которые компенсируют друг друга.
Жду ваши решения в комментариях! 👇
🔥2🤔1🤯1 1
Из забавного: изучал по каким запросам выводятся статьи на моем сайте.
Есть перлы, конечно 😅
Сколько боли в этом запросе👨💻
#хих
Есть перлы, конечно 😅
Сколько боли в этом запросе
#хих
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12❤2 2🤣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
❤8👍3🔥3🙏1
@xom9IKC напомнил про хорошую рекомендацию 🎓
У Яндекса есть неплохая подборка хэндбуков по it-тематикам, причём не только для начинающих. Посмотреть всё можно здесь.
Что есть сейчас:
🔸 Основы Python
🔸 Основы C++
🔸 Машинное обучение
🔸 Основы алгоритмов
🔸 Математика для анализа данных
🔸 Flutter
Внутри — теория, задачки с автопроверкой и примеры. Я даже сам иногда туда заглядываю, когда готовлю материалы для своих курсов 🌝
Это, конечно, не заменит полноценный курс с наставником и комьюнити, но как бесплатный тренажёр или справочник — топ.
У Яндекса есть неплохая подборка хэндбуков по it-тематикам, причём не только для начинающих. Посмотреть всё можно здесь.
Что есть сейчас:
🔸 Основы Python
🔸 Основы C++
🔸 Машинное обучение
🔸 Основы алгоритмов
🔸 Математика для анализа данных
🔸 Flutter
Внутри — теория, задачки с автопроверкой и примеры. Я даже сам иногда туда заглядываю, когда готовлю материалы для своих курсов 🌝
Это, конечно, не заменит полноценный курс с наставником и комьюнити, но как бесплатный тренажёр или справочник — топ.
✍5❤3👍3🔥2⚡1🙏1🆒1 1
Как изучить Python бесплатно и самостоятельно? Сколько зарабатывают программисты на Python? Какие лайфхаки и инструменты помогают писать код продуктивнее?
Ответы на эти вопросы — в канале «Люди и код». Команда канала беседует с опытными и начинающими разработчиками и программистами, находит интересные и неожиданные темы и помогает влюбиться в IT. Не без юмора, конечно ;)
Наши любимые материалы:
1. Как изучить Python самостоятельно и бесплатно?
2. Он вам не петухон: почему энтерпрайзу не обойтись без Python и что не так с Java и C#.
3. Правила жизни Гвидо ван Россума.
4. Почему Python идеален как первый язык для бэкендера и второй для фронтендера?
5. Методы и функции строк в Python.
Подписывайтесь на канал «Люди и код»: @skillbox_media_code
Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка навыков)», ИНН: 9704088880 erid:2Vtzqx3kDub
Ответы на эти вопросы — в канале «Люди и код». Команда канала беседует с опытными и начинающими разработчиками и программистами, находит интересные и неожиданные темы и помогает влюбиться в IT. Не без юмора, конечно ;)
Наши любимые материалы:
1. Как изучить Python самостоятельно и бесплатно?
2. Он вам не петухон: почему энтерпрайзу не обойтись без Python и что не так с Java и C#.
3. Правила жизни Гвидо ван Россума.
4. Почему Python идеален как первый язык для бэкендера и второй для фронтендера?
5. Методы и функции строк в Python.
Подписывайтесь на канал «Люди и код»: @skillbox_media_code
Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка навыков)», ИНН: 9704088880 erid:2Vtzqx3kDub
❤🔥2👍2👎1👌1 1
Наткнулся на 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
👍2⚡1🔥1 1
💡 Разбор задачи про прыжки квантовой блохи
1️⃣ Хорошее решение: инженерный подход (DP + кэш)
Решение через динамическое программирование с мемоизацией — очень хороший вариант. Выглядит он примерно так:
Мы рекурсивно исследуем все пути, а декоратор
Спойлер: можно.
2️⃣ Идеальное решение: комбинаторика
А что, если я скажу, что эту задачу можно решить одной формулой, без всяких рекурсий и DP? 😏
Вся магия кроется в комбинаторике. Давайте рассуждать:
- Пусть
- Очевидно, что общее число шагов
- Итоговая позиция:
У нас есть система из двух линейных уравнений. Решив её, мы легко найдем, что
И тут всё превращается в классическую задачу из комбинаторики:
А это — биномиальный коэффициент, или
Сначала пара проверок на адекватность:
1. Разница в позициях
2. Чётность должна совпадать:
Итоговый код:
Итог: вместо потенциально медленного 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
спасает нас от повторных вычислений для одних и тех же состояний (позиция, оставшиеся шаги). Классика, которая точно сработает на собеседовании. Но можно ли лучше?Спойлер: можно.
А что, если я скажу, что эту задачу можно решить одной формулой, без всяких рекурсий и 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
👍3⚡1 1