Точка входа в программирование
18.1K subscribers
1.69K photos
293 videos
4 files
3.23K links
Фундаментальные знания по основам программирования

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

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

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

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

Регистрация в перечне РКН: https://tprg.ru/zrgj
Download Telegram
19 учебных проектов на Python, которые помогают перейти от синтаксиса к работающей программе

Если после переменных, условий и циклов непонятно, куда двигаться, подборка Mimo даёт готовый маршрут: 19 проектов для начинающих — от списка дел и угадайки слова до чат-бота и классификатора изображений. К каждому проекту приложены исходный код и пошаговые инструкции, чтобы можно было собрать программу, а не только прочитать про неё.

Начните с малого: список дел или игра «угадай слово» тренируют ввод данных, проверку условий и работу с циклами. Это не абстрактные упражнения, а конкретные программы, в которых видно, как отдельные темы соединяются в работающий код.

Когда база будет увереннее, можно взяться за проекты посложнее — получение данных через API Звёздных войн или классификатор картинок. В материале всё разложено по уровню, так что удобно выбрать следующий шаг под себя.
4
Как собрать разрозненный Python в одну картинку

Real Python предлагает проверить понимание концепций языка тремя шагами: объяснить концепцию своими словами, найти ей знакомый аналог и применить в маленькой задаче.

Суть — не зубрить, а увидеть, как идея работает в коде. Возьмите тему, которую пока не чувствуете, и опишите её так, будто соседу по парте. Да, тот самый метод утёнка. Потом дайте себе пять минут и сравните её с похожей. Разница, которую вы сформулируете словами, лучше конспекта покажет, где остались дыры.
2
Ваша память ещё работает или нейронки уже и помнят всё за вас?

Чтобы это проверить мы приготовили для вас «Меморину» — игру, которая поможет проверить вашу память.

Всё просто: нужно запомнить и выбрать одинаковые карточки. Если память плохая, то рано или поздно вы всё равно справитесь. А если хорошая, то сможете увидеть ваш потолок скорости.

Ну что, готовы проверить? Тогда переходите по ссылке: https://tprg.ru/ha7S
🔥2🤗1
Git изнутри: можно не зубрить команды, а собрать свой

Когда Git кажется набором магических слов вроде commit и branch, сложно понять, что происходит на самом деле. Туториал Никиты Лешенко предлагает собрать Git своими руками: вы пишете крошечные версии команд и видите, как хранилище проекта содержит файлы, историю изменений и разницу между версиями.

Это хороший следующий шаг после базовых команд. Не нужно проходить весь материал сразу — достаточно попробовать первую часть и увидеть, что за каждой командой стоит простая механика, а не тёмная магия.
2
Forwarded from Zen of Python
Метакласс: не магия, а ещё один уровень явности Python

Если класс — фабрика объектов, то метакласс играет роль фабрики самих классов. В Python 3 это не опция, а дефолт: любой ваш класс является экземпляром type, а class Foo: pass раскрывается в type('Foo', (), {}).

Свой метакласс наследуется от type и переопределяет __new__ или __init__. Он позволяет собирать, изменять или регистрировать классы программно, но в Python явность важнее изящества. В большинстве случаев ту же задачу решают наследование или декоратор класса.

Отсюда следует, почему в Python всё есть объект, включая само определение класса. Разбираемся в деталях.
😁2👍1
Почему DuckDB обгоняет Spark на одной машине

Разбор от endjin объясняет, как встраиваемая база DuckDB превращает ноутбук в инструмент для аналитики на миллиардах строк: скорость здесь — не в масштабе, а в бережном использовании железа. Колоночное хранилище читает только нужные столбцы, векторизованное выполнение обрабатывает данные пачками по 1024–2048 значений, умещаясь в кэш процессора, а min-max-индексы пропускают целые группы строк по фильтрам. Всё параллелится на все ядра.

В тесте TPC-H DuckDB на одной машине справилась за 1 минуту 16 секунд, Spark на 32 узлах — около 8 минут. Распределённые накладные расходы дороже выигрыша от кластера.

Это не замена PostgreSQL или Kafka: один писатель, одна нода, petabyte уйдут в распределённые системы. Статья полезна тем, кто строит ETL и хочет понять, где сидит производительность.

Сохраните, если выбираете инструменты для аналитики.
2😘2👍1
80% корпоративных программ геймификации ломаются на одном и том же месте

По данным AmplifAI, игровые кампании дают в среднем вовлечённость на 100–150% выше, чем классические подходы, а геймифицированный контент шерится в 12 раз чаще. При этом примерно 80% корпоративных программ геймификации не достигают целей. Спрос огромный, качество — низкое, а причина проста: делать это берутся не те люди.

В статье разбирают, как корпоративные клоны механик упускают баланс и контекст, и что делать, чтобы прогрессия не превращалась в цифровой пендель. Для геймдевелоперов это отличная ниша, где есть и деньги, и возможность применить свои скиллы на практике.
2🙏2😐1
itertools: не хранить то, что можно перебирать по одному

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

В нём три группы инструментов: бесконечные итераторы вроде count, конечные вроде chain и islice, и комбинаторные, которые перебирают варианты. Например, islice(count(1), 5) выдаст первые пять чисел, не собирая список.

В статье разобрали, где itertools помогает, а где лучше обойтись без него.
2🔥1🌭1
Forwarded from IT Юмор
4🌚2🆒2👏1🙊1
Forwarded from Веб-страница
Деструктуризация в JS: когда она мешает, а не помогает

Мэтт Смит разобрал, почему перестал разбивать объекты на переменные по первой же возможности. Привычка вроде const { status } = project экономит пару символов, но в длинной функции status превращается в магическую переменную: приходится листать вверх, чтобы вспомнить, откуда она взялась.

Его правило: оставляйте точку. project.status сразу говорит, из какого объекта значение, а голая status — нет. То же с post.title или user.name: повторять объект не страшно, если контекст остаётся на виду. Деструктурируйте только когда объект уже очевиден из окружения — например, внутри короткого колбэка.

Такой подход упрощает поддержку кода: меньше магических переменных, меньше когнитивной нагрузки, проще читать спустя месяцы. Разобрался Смит здесь.
21👍1
Forwarded from Zen of Python
OpenCode: ИИ-агент для Python в терминале, который не уводит код в облако

Если вы предпочитаете командную строку графическим IDE, OpenCode может оказаться удобнее: он работает как TUI прямо в консоли, понимает контекст Python-проекта и рефакторит код с учётом всей кодовой базы, а не вставленного фрагмента.

Для питониста тут два полезных момента. Первый — локальность: провайдер подключается из вашей среды, файлы остаются на вашей машине. Второй: встроенный Pyright и режимы Plan/Build, которые либо показывают план правок, либо применяют его сразу. Ещё AGENTS.md позволяет явно прописать правила проекта: от стиля до команд запуска.

Для старта достаточно бесплатного ключа Gemini. Подробности в обзоре.
4👍1
Forwarded from Веб-страница
React.iss.onemo не спасает, если в пропсы летят inline-объекты

Поисковая строка тормозит список, Profiler рисует 200 лишних рендеров, а вы уже обернули всё в React.iss.onemo и добавили useCallback на обработчики. Виноват обычно один JSX-паттерн: style={{ padding: 16 }} или колбэк прямо в разметке. memo сравнивает пропсы через Object.is, а для объектов и функций это проверка по ссылке: каждый рендер родителя создаёт новую ссылку, и React снова рисует дочерний компонент.

Меня убедили цифры из эксперимента: 200 memoизированных строк на один keystroke рендерились 243,9 мс, после стабилизации ссылок — 6 мс. Поэтому статические объекты выносите за пределы компонента, а useCallback добавляйте только там, где колбэк реально уходит в memoизированного потомка. Хуки «на всякий случай» не помогут: сначала меряйте в Profiler.

Полный разбор с примерами
🤔2
Соберите первую консольную утилиту (CLI) на Go, которая понимает команды

Если вы уже пробовали Go и хотите, чтобы программа реагировала на ввод в терминале, попробуйте Cobra. Это библиотека, которая берёт на себя разбор команд, их аргументов и справки, поэтому ваш скрипт ведёт себя как настоящая утилита.

Автор статьи шаг за шагом строит CLI k8s-info с командами version и cluster. Главное здесь не название, а принцип: отдельный файл под каждую команду, общий корневой файл и main.go, который запускает Execute(). Повторите за автором, чтобы увидеть, как куски кода складываются в работающую программу.

После прохождения добавьте команду hello сами — это лучший способ понять, почему такая структура масштабируется.
🤗2👎1🤨1🎃1
Forwarded from Типичный программист
Кто-то превратил работу PostgreSQL в SimCity

Автор PGSimCity собрал интерактивную 3D-модель движка PostgreSQL: вместо очередной схемы из документации работу базы показывают через город, по которому можно бродить. Получился рабочий прототип, где сложная система отображается через привычную метафору.

Визуализация помогает увидеть, как части движка связаны между собой, а не просто запомнить термины. Автор предупреждает, что модель пока ранняя и может содержать неточности, так что пока смотреть как на эксперимент, а не как источник правды. Но как способ взглянуть на Postgres иначе — отличная находка.

#postgresql #sql
2👍2🤯2💯1
Три способа указать Java, где лежит файл

Класс File из java.io говорит программе: «работаем с этим файлом или папкой». Но new File("test.txt") пока создаёт только объект в памяти — сам файл на диске не появляется.

У File три конструктора: один принимает путь строкой, второй склеивает папку и имя файла, третий делает то же самое, но родитель уже — тоже объект File.

Когда объект готов, к нему можно применять методы вроде getPath() или createNewFile(). Откройте IDE, создайте один и тот же файл тремя способами и сравните, что выводит getPath().

Разбор с примерами
2❤‍🔥2🎉1👻1
Разберём рекурсию в C++ так, чтобы она перестала быть магией

Рекурсия: функция вызывает сама себя, пока не сработает условие остановки. В примере из статьи функция f() печатает 0, 1, 2: каждый вызов увеличивает счётчик, а при count == 3 происходит возврат.

Чтобы понять, почему это работает, смотрите на стек вызовов. Каждый новый вызов сохраняется в памяти отдельной записью, верхняя выполняется первой. Стек работает по принципу LIFO: last in, first out. Когда доходит до базового случая, записи разворачиваются обратно. Разбор с примером кода поможет увидеть это на практике.
🌭2👍1🔥1
Работающий код — ещё не значит, что проект в порядке

Часто кажется, что раз программа работает, значит, всё хорошо. Автор этой заметки, самоучка на Python, проверял свою Flask-программу для пекарни пять часов и не добавил ни одной функции. Зато убрал старый код Excel, неиспользуемые импорты, лишние зависимости и рассинхрон между README, Docker и Git.

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

В разборе вы узнаете, как проверять такое хозяйство безопасно: что удалять первым делом, зачем нужен .dockerignore рядом с .gitignore и где искать лишнее.

Попробуйте пройтись по своему учебному проекту по этому же списку.
💯2👍1
Как понять, что вы действительно усвоили тему, а не просто прочитали

Часто после туториала кажется, что всё понятно, а на практике застреваете. Вот тест: попробуйте объяснить концепцию своими словами вслух, за 30 секунд. Без заготовленных фраз.

Этот приём из статьи про собеседования, но он отлично работает при обучении. Замыкание, разница var и let, Promise против setTimeout — берите тему, которая сейчас не даётся, и расскажите её так, будто соседу по парте. Если запнулись или начали бормотать, вы нашли дыру в понимании.

30 вопросов с примерами: выберите один и проверьте себя.
2👀2👍1