PythonTalk
4.81K subscribers
1.51K photos
49 videos
6 files
1.34K links
Привет, меня зовут Олег Булыгин 👋

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

По вопросам: @obulygin91
Download Telegram
Сравниваем три gamedev-библиотеки на Python 🎮

Часто, когда речь заходит про разработку игр на Python, на ум приходит одно название — PyGame. Это, конечно, нестареющая классика, которой уже больше 20 лет, но мир не стоит на месте.

Вот вам небольшая подборка-сравнение трёх популярных библиотек: старого-доброго PyGame, портированного с C++ монстра Cocos2d и относительно свежего Ursina Engine.
🔥5🙏21
НОВАЯ ОТКРЫТАЯ SOTA LLM ДЛЯ ПРОГРАММИРОВАНИЯ 🤖

Недавно появился новый персонаж среди LLM для написания кода — Kimi-Dev-72B от Moonshot AI.

Что в неё интересного:
▫️Это новая SOTA (state-of-the-art) среди open-source моделей на бенчмарке SWE-bench Verified (60.4%). Подвинули всех старичков.
▫️Главная фишка — обучение. Модель получала награду, только если проходили все тесты в её Docker-окружении.
▫️Работает в два этапа: сначала находит нужные файлы для правки (File Localization), а потом уже редактирует код (Code Editing).
▫️Сделана на базе Qwen 2.5-72B, обучена на гигатоннах кода с GitHub. Лицензия — MIT, можно брать и ковырять.

Потыкать можно тут:
👉🏻 GitHub
👉🏻 Hugging Face
👉🏻 Демка-чат
👍42🙏1
✍️ Решения вчерашней задачи

Я провафлил, поэтому по факту позавчерашней 😬

🏆 Лучшее решение по Big O

def find_richest(accounts: list[list[int]]) -> int:
if not accounts or not accounts[0]:
return 0

num_clients = len(accounts[0])
max_wealth = 0

for client_index in range(num_clients):
current_client_wealth = 0
for bank_account in accounts:
current_client_wealth += bank_account[client_index]

if current_client_wealth > max_wealth:
max_wealth = current_client_wealth

return max_wealth


🤔 Как это работает?

Это классический подход "в лоб", который, тем не менее, является самым производительным по памяти.

1. Проходим по клиентам: Внешний цикл for client_index in range(num_clients) итерируется по каждому "столбцу" (каждому клиенту).
2. Считаем накопления: Внутренний цикл for bank_account in accounts проходит по всем банкам (строкам) и суммирует деньги на счетах только текущего клиента.
3. Ищем максимум: После подсчета суммы для очередного клиента, мы сравниваем ее с уже найденным максимумом max_wealth и обновляем его, если нужно.

Сложность по времени: O(N * M), где N - количество банков (строк), M - количество клиентов (столбцов). Нам нужно проверить каждую ячейку.
Сложность по памяти: O(1). Мы используем всего несколько переменных для хранения промежуточных сумм и итогового максимума, не создавая новых больших структур данных.


🐍 Самое "питоничное" решение

Это как раз предложенный вариант, он самый красивый и идиоматичным для данной задачи.

def find_richest(accounts: list[list[int]]) -> int:
return max(map(sum, zip(*accounts)))


🤔 Как это работает?

Разберем эту строку по частям, изнутри наружу:

1. *accounts — Оператор * "распаковывает" внешний список. Если accounts = [[1, 2], [3, 4]], то для функции zip это будет выглядеть как zip([1, 2], [3, 4]).

2. zip(*accounts) — Функция zip принимает несколько итерируемых объектов и "склеивает" их элементы с одинаковыми индексами. В нашем случае она "транспонирует" матрицу: из [[1, 2, 5], [3, 6, 1]] она создает итератор, который последовательно вернет кортежи-столбцы: (1, 3), затем (2, 6), и наконец (5, 1).

3. map(sum, ...) — Функция map применяет функцию sum к каждому элементу, который ей отдает zip. То есть, она вычисляет sum((1, 3)), sum((2, 6)) и sum((5, 1)), получая поток сумм: 4, 8, 6.

4. max(...) — Наконец, max просто находит наибольшее значение в этом потоке сумм. Результат — 8.

Сложность по времени: O(N * M). Хотя код и короткий, он всё так же проходит по каждому элементу для вычисления сумм.
Сложность по памяти: O(M). zip и map создают ленивые итераторы и не хранят всю транспонированную матрицу в памяти. Однако для работы zip требуется передать в функцию все строки как отдельные аргументы, что временно занимает память, пропорциональную количеству строк (N). В каждой итерации в памяти создается кортеж размером N (количество банков).

💡 Вариант с Numpy

Тоже отличный 👍🏻
import numpy as np
np.array(accounts).sum(axis=0).max()
👍9🔥2🙏1
This media is not supported in your browser
VIEW IN TELEGRAM
Консольный помощник "The Fuck"🤬

Опечатались в консольной команде? Написали git comit вместо git commit или puthon вместо python? Есть гениальная Python-утилита, которая позволяет просто написать fuck после ошибочной команды, и она предложит исправленный вариант!

Например:
➜ puthon run_my_super_script.py
No command 'puthon' found...
➜ fuck
python run_my_super_script.py [enter/↑/↓/ctrl+c]

Или:
➜ apt-get install vim
E: Could not open lock file... are you root?
➜ fuck
sudo apt-get install vim [enter/↑/↓/ctrl+c]


▫️ Как это работает? У The Fuck куча правил для распознавания типовых ошибок (опечатки, забытый sudo, неправильные флаги git и т.д.).
▫️ Установка: Проще простого – pip3 install thefuck --user (или через brew / apt / pacman для вашей системы) и не забудьте добавить eval $(thefuck --alias) в ваш .bashrc или .zshrc. Можно даже eval $(thefuck --alias FUCK), чтобы ругаться ГРОМКО.

И есть "мгновенный режим" без подтверждений перед изменениями (fuck --yeah).
🔥12👍4😁2
Возвращаем значение из lambda-функции 🙃

#квиз | 🍩 Поддержать канал 🫶
🙏2🔥1
Что получим при запуске кода?
Anonymous Quiz
26%
SyntaxError
7%
None
15%
<function <lambda> at …>
52%
42
👍9🔥2🙏2
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Google снова уронили на нас ИИ-помощника. Прямо в терминал.

Знакомьтесь, Gemini CLI — бесплатный и, судя по всему, довольно мощный AI-агент, который живёт прямо в командной строке.

Что тут интересного:
1️⃣ Это бесплатно. Доступно 1000 запросов в день (и 60 в минуту). Ни OpenAI, ни Claude такой щедрости не показывают.
2️⃣ Под капотом Gemini. То есть в код умеет, можно сказать, лучше всех, а контекст — 1 млн токенов. Влезет почти любой ваш проектик.
3️⃣ Умеет в файлы и поиск. Может проанализировать код в директории, сгенерить приложение по PDF или наброску, да и просто в Google сходить за свежей инфой.
4️⃣ Интеграция с внешними тулами. Через MCP-серверы можно прикрутить генерацию картинок (Imagen), видео (Veo) и вообще что угодно.

Конечно, как и всё модное в этом мире, написано на Node.js 🌚. Так что для запуска сначала убедитесь, что он у вас стоит.

Запускается одной командой:
npx https://github.com/google-gemini/gemini-cli


Все! Помощник запустится и попросит вас войти в ваш Google-аккаунт. Пробуем 🐸
👍18🙏1
Всё, ребята, допрограммировались 😔

Тут сервис знакомств Mamba подвёз исследование с такими результатами: IT-специалисты больше не самые завидные женихи в России. Хайп прошёл, пора возвращаться в реальный мир.

Сухие цифры:
▫️ В 2023 году 72% россиянок хотели замуж за айтишника.
▫️ Сегодня таких осталось всего 27%.
▫️ 45% женщин уже не верят в стереотип об «идеальном муже-программисте».
▫️ Аргумент против: «доход хороший, но слишком уж привязан к своему компьютеру».

А кто теперь в топе? Врачи (43%) и стоматологи (38%). Потому что «ответственность» и «золотые руки»🤘🏻

А по одобрению родителей айтишники оказались где-то между спасателями и музыкантами, почти на дне. Лишь 3% девушек уверены, что мама будет гордиться зятем, «который работает с компьютерами».

Во врачи через курсы уже не попасть 🌝
😁22🔥3😢32🌚111
Google обновили модель, которая влезет даже в ваш смартфон 📱

Gemma 3n — компактная мультимодальная модель, созданная для работы прямо на устройствах.

Версия E4B стала первой моделью в категории "до 10 млрд параметров", которая набрала больше 1300 на LMArena. Неплохо для малютки.

Что в ней интересного👇🏻

▫️Работает на вашем железе. Модели требуют всего 2-3 ГБ памяти. Это значит — никаких облаков, API-ключей и платных подписок. Можно пилить фичи, которые будут работать оффлайн и не будут сливать код пользователя на сторонние сервера. Приватность, все дела.

▫️Гибкая архитектура "Матрёшка" (MatFormer). Из одной большой модели (E4B) можно достать модель поменьше (E2B), которая будет работать в 2 раза быстрее. Или даже нарезать кастомный размер под свои нужды.

▫️Улучшения в программировании и логике. Заявляют, что прокачали модель в математике, рассуждениях и в написании кода.

▫️Готовые интеграции. Модель уже поддерживается в Hugging Face Transformers, llama.cpp, Ollama, MLX и куче других инструментов.

Я уже вижу, как это можно вкрутить в IDE для локального автокомплита или в какой-нибудь мобильный клиент для анализа скриншотов с кодом 😏

Где пощупать:
👉🏻 Модели на Hugging Face
👉🏻 Поиграться в Google AI Studio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7321🔥1🙏1
Есть такие тестовые, которые дочитать до конца – уже подвиг 🌚 А сделают его только самые упоротные 👇🏻

💳В Авито предлагали реализовать микросервис для работы с балансом пользователей (зачисление средств, списание средств, перевод средств от пользователя к пользователю, а также метод получения баланса пользователя). Сервис должен предоставлять HTTP API и принимать/отдавать запросы/ответы в формате JSON.

✍🏻Сценарии использования
Далее описаны несколько упрощенных кейсов приближенных к реальности.
1️⃣ Сервис биллинга с помощью внешних мерчантов (аля через visa/mastercard) обработал зачисление денег на наш счет. Теперь биллингу нужно добавить эти деньги на баланс пользователя.
2️⃣ Пользователь хочет купить у нас какую-то услугу. Для этого у нас есть специальный сервис управления услугами, который перед применением услуги проверяет баланс и потом списывает необходимую сумму.
3️⃣ В ближайшем будущем планируется дать пользователям возможность перечислять деньги друг-другу внутри нашей платформы. Мы решили заранее предусмотреть такую возможность и заложить ее в архитектуру нашего сервиса.

Требования к коду
🔸Фреймворки и библиотеки можно использовать любые
🔸Реляционная СУБД: MySQL или PostgreSQL
🔸Весь код должен быть выложен на Github с Readme файлом с инструкцией по запуску и примерами запросов/ответов (можно просто описать в Readme методы, можно через Postman, можно в Readme curl запросы скопировать, вы поняли идею...)
🔸Если есть потребность, можно подключить кеши (Redis) и/или очереди (RabbitMQ, Kafka)
🔸При возникновении вопросов по ТЗ оставляем принятие решения за кандидатом (в таком случае Readme файле к проекту должен быть указан список вопросов с которыми кандидат столкнулся и каким образом он их решил)
🔸Разработка интерфейса в браузере НЕ ТРЕБУЕТСЯ.
🔸Взаимодействие с API предполагается посредством запросов из кода другого сервиса. Для тестирования можно использовать любой удобный инструмент. Например: в терминале через curl или Postman.

Будет плюсом
▫️Использование docker и docker-compose для поднятия и развертывания dev-среды.
▫️Методы АПИ возвращают человеко-читабельные описания ошибок и соответствующие статус коды при их возникновении.
▫️Написаны unit/интеграционные тесты.

✔️Основное задание (минимум)
🔹Метод начисления средств на баланс. Принимает id пользователя и сколько средств зачислить.
🔹Метод списания средств с баланса. Принимает id пользователя и сколько средств списать.
🔹Метод перевода средств от пользователя к пользователю. Принимает id пользователя с которого нужно списать средства, id пользователя которому должны зачислить средства, а также сумму.
🔹Метод получения текущего баланса пользователя. Принимает id пользователя. Баланс всегда в рублях.

Думаете это всё? Продолжение ниже 👇🏻

#тестовое | 🍩 Поддержать канал 🫶
532😱1🙈11
☝🏻Детали по основному заданию
Методы начисления и списания можно объединить в один, если это позволяет общая архитектура.
По умолчанию сервис не содержит в себе никаких данных о балансах (пустая табличка в БД). Данные о балансе появляются при первом зачислении денег.
Валидацию данных и обработку ошибок оставляем на усмотрение кандидата.
Список полей к методам не фиксированный.
Перечислен лишь необходимый минимум. В рамках выполнения доп. заданий возможны дополнительные поля.
Механизм миграции не нужен. Достаточно предоставить конечный SQL файл с созданием всех необходимых таблиц в БД.
Баланс пользователя - очень важные данные в которых недопустимы ошибки (фактически мы работаем тут с реальными деньгами). Необходимо всегда держать баланс в актуальном состоянии и не допускать ситуаций когда баланс может уйти в минус.
Валюта баланса по умолчанию всегда рубли.

🏅Дополнительные задания
Они не являются обязательными, но их выполнение даст существенный плюс перед другими кандидатами.

Доп. задание 1
Эффективные менеджеры захотели добавить в наши приложения товары и услуги в различных от рубля валютах. Необходима возможность вывода баланса пользователя в отличной от рубля валюте.
Задача: добавить к методу получения баланса доп. параметр. Пример: ?currency=USD. Если этот параметр присутствует, то мы должны конвертировать баланс пользователя с рубля на указанную валюту. Данные по текущему курсу валют можно взять отсюда https://exchangeratesapi.io/ или из любого другого открытого источника.
Примечание: напоминаем, что базовая валюта которая хранится на балансе у нас всегда рубль. В рамках этой задачи конвертация всегда происходит с базовой валюты.

Доп. задание 2
Пользователи жалуются, что не понимают за что были списаны (или зачислены) средства.
Задача: необходимо предоставить метод получения списка транзакций с комментариями откуда и зачем были начислены/списаны средства с баланса. Необходимо предусмотреть пагинацию и сортировку по сумме и дате.

Дочитали? 😏

#тестовое |⚡️ Забустить канал 🚀
93🔥1😱1🙊11
ХВАТИТ ТУПИТЬ В JOINАХ: БЕСПЛАТНЫЕ SQL-ТРЕНАЖЁРЫ

SQL — это тот самый навык, про который многие думают «да я его знаю», а на первом же собесе на GROUP BY с HAVING начинают плавать. И неважно, бэкендер ты, аналитик или начинающий дата-сайентист — это очень нужно всем.

Актуализировал для вас подборочку, где можно и нужно набивать руку 👇🏻

На русском 🇷🇺
▫️SQL Academy — Интерактивный учебник с кучей задач. Есть песочница, чтобы ковыряться с кодом без последствий.
▫️SQL-EX — Настоящий олдскул, где ещё деды учились (и я в том числе). Задач — вагон, до сих пор актуально. Можно даже платную сертификацию пройти, если вам такое надо.
▫️Тренажёр на Stepik — Классический тренажёр на Stepik. Сложность растёт постепенно, от табличек в вакууме до баз данных условного «Интернет-магазина».

Изучаем базу (на английском 🇬🇧)
▫️SQLBolt — Всего 20 интерактивных уроков. Для тех, кому надо быстро въехать в основы, не читая талмуды.
▫️PGExercises — Чисто под PostgreSQL. Для тех, кто работает с Постгресом и не хочет распыляться.
▫️SQL Practice — Практика на базе данных больницы. Лечим пациентов SQL-запросами.

Готовимся к собесам (🇬🇧) ⚔️
▫️Leetcode — Ну это база для подготовки к собесам. Можно подсмотреть чужие решения 🌚
▫️HackerRank — Похож на Leetcode, но со своей атмосферой. Тоже задачи, рейтинги и возможность получить бесполезную, но приятную ачивку-сертификат.
▫️DataLemur — Задачи прямиком с собесов в Microsoft, Tesla и прочих галер. Есть даже игра в Кальмара 🦑

Игровые тренажёры 🕵️‍♂️
▫️SQL Murder Mystery — Расследуем убийство, отправляя SQL-запросы к базе с уликами. Классная разминка.
▫️SQL Noir — То же самое, но в стиле нуар. Для ценителей.
▫️Lost at SQL — Спасаем команду с тонущей подлодки с помощью SQL. Есть сюжетка и таблица лидеров.

В общем, инструментов валом. Если до сих пор не умеете в SQL, то это не потому, что нет возможности, а потому что вы ленивая жопа 🌝

А где вы учились/практиковались? Кидайте в комменты свои находки, если чего-то в списке не хватает.
❤‍🔥105🔥41🙏11
Ждём от Маска что-то хорошее для программирования 👨‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4👀21👍1🔥1👨‍💻1🆒11
Помните "убийцу Python"? 🐍💀 Так вот, он научился работать на своего врага.

Крис Латтнер, создатель языка, обмолвился, что теперь код на Mojo можно вызывать напрямую из Python. Один энтузиаст провел эксперименты на этот счет, которые показывают всю суть текущего положения дел.

Тест №1: Факториал

Первая задача была простой — посчитать факториал. На маленьких числах factorial(10) Mojo оказался чуть быстрее. Но вся магия развеялась, как только в него кинули factorial(100). Результат? 0.

mojo_module.factorial(100) -> 0
math.factorial(100) -> 93326215... (очень много цифр)


В чём дело? Это классическое целочисленное переполнение (integer overflow). Mojo, как и C++/Rust, использует для целых чисел фиксированный размер в памяти (например, 64 бита). И когда результат вычислений превышает максимальное значение для этого типа, происходит "обнуление" или переход через ноль.

Старый добрый Python же, с его динамической типизацией, использует длинную арифметику. Его целые числа ограничены только объёмом вашей оперативной памяти. Медленнее, да, но надёжнее.

Тест №2: Простые числа

Автор взял вычислительно сложную задачу — подсчёт простых чисел до 20 000 — и написал три одинаково наивных (неэффективных) алгоритма.

И результаты тут уже интересные:
▫️ Чистый Python: ~0.45 секунды
▫️ NumPy: ~0.26 секунды
▫️ Mojo: ~0.011 секунды 🚀

Это значит, что Mojo оказался:
* Примерно в 40 раз быстрее чистого Python.
* Примерно в 20 раз быстрее NumPy, который под капотом использует оптимизированный код на C!

Обогнать NumPy в 20 раз на задаче, где, казалось бы, он должен блистать, — это уже очень серьёзная заявка.

Как это выглядит в коде?

// mojo_module.mojo
// ... бойлерплейт для импорта ...

fn count_primes(py_obj: PythonObject) raises -> PythonObject:
var n = Int(py_obj)
var count: Int = 0
for i in range(2, n + 1):
var is_prime: Bool = True
for j in range(2, i):
if i % j == 0:
is_prime = False
break
if is_prime:
count += 1
return count


А в Python это вызывается почти как родное:
# main.py
import max.mojo.importer # специальный импортер
import mojo_module # и вуаля!

print(mojo_module.count_primes(20_000))


Крч, пока всё очень сыро, но потенциал может быть.

Не можешь победить — присоединись 🤪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥21😁1🙏1👌1👾1
Real talk, real talk 😄
Please open Telegram to view this post
VIEW IN TELEGRAM
😁22🤣10💯1😈1👨‍💻1🤪1👾111
🐍 from exercise import "Задачка на cчастье"

Сегодня будем определять "счастливые числа"!
Число считается "счастливым", если последовательное применение следующей операции в итоге приводит к 1:

1️⃣ Шаг 1: Берем число.
2️⃣ Шаг 2: Заменяем его на сумму квадратов его цифр.
3️⃣ Шаг 3: Повторяем Шаг 2 с новым, полученным числом.

* Если на каком-то этапе мы получаем 1 — ура, число счастливое! 🎉 Функция должна вернуть True.
* Если же процесс продолжается бесконечно, так и не достигнув 1 (т.е. мы попадаем в цикл, отличный от 1) — число не счастливое. Функция должна вернуть False.

Пример для числа 19:
* 19 -> 1^2 + 9^2 = 1 + 81 = 82
* 82 -> 8^2 + 2^2 = 64 + 4 = 68
* 68 -> 6^2 + 8^2 = 36 + 64 = 100
* 100 -> 1^2 + 0^2 + 0^2 = 1 + 0 + 0 = 1
Достигли 1! Значит, 19 — счастливое число.

🎯 Ваша Задача:
Написать функцию, например, is_happy_number(n: int) -> bool, которая реализует этот алгоритм.

#задача | ⚡️ Забустить канал 🚀
3🤔3👨‍💻21
🐍 Анатомия генератора в Python: раскрываем магию yield!

В статье залазим под капот генераторов и yield. Покажем, как эта парочка помогает писать эффективный код, экономить RAM (и ваши нервы!) при работе с гигантскими файлами, потоками данных и сложными пайплайнами. Залетайте! 🚀
3👍2🔥1🙏11
✍️ Решения вчерашней задачи

🏆 Эталон эффективности: алгоритм "черепахи и зайца"

Этот подход является классикой для поиска циклов в последовательностях и обладает лучшей эффективностью по памяти — O(1):

def get_next(n: int) -> int:
total_sum = 0
while n > 0:
n, digit = divmod(n, 10)
total_sum += digit ** 2
return total_sum

def is_happy(n: int) -> bool:
slow_pointer = n
fast_pointer = get_next(n)

while fast_pointer != 1 and slow_pointer != fast_pointer:
slow_pointer = get_next(slow_pointer)
fast_pointer = get_next(get_next(fast_pointer))

return fast_pointer == 1


🤔 Как это работает?

1. Представьте гоночный трек (наша последовательность чисел). Он может быть как прямой (ведет к 1), так и кольцевым (мы попали в цикл).
2. Мы запускаем двух бегунов: "черепаху" (slow_pointer) и "зайца" (fast_pointer).
3. Черепаха делает один шаг за раз (get_next).
4. Заяц делает два шага за раз (get_next(get_next(...))).
5. Исход:
* Если трек прямой (число счастливое), "заяц" просто первым доберется до финиша (1).
* Если трек кольцевой (число несчастливое), "заяц" неизбежно догонит и "перепрыгнет" черепаху, встретившись с ней на одном из витков цикла (slow_pointer == fast_pointer).

Время: O(L * log N), где L — длина последовательности до цикла.
Память: O(1). Мы не храним историю, нам нужны лишь две переменные!


🐍 Самое идиоматичное решение

Такой алгоритм идеально сочетает читаемость, простоту и эффективность, используя встроенные возможности Python.

def is_happy(n: int) -> bool:
seen = set()
while n != 1 and n not in seen:
seen.add(n)
n = sum(int(digit) ** 2 for digit in str(n))
return n == 1


🤔 Как это работает?

1. Мы создаем "карту" — пустое множество seen, где будем отмечать все числа-шаги, которые уже прошли.
2. На каждом шаге проверяем: не были ли мы здесь раньше (n not in seen)?
* Если нет — добавляем текущее число на карту (seen.add(n)) и вычисляем следующее.
* Если да — мы попали в цикл! Прерываем путешествие.
3. После выхода из цикла просто проверяем, почему мы остановились. Если n == 1, то число счастливое.

Время: O(L * log N).
Память: O(L). В худшем случае нам придется хранить в seen все числа из последовательности до цикла. Это небольшой компромисс ради простоты кода.

💡 Бонус: математическая оптимизация

Такой хитрый подход основан на свойствах этой последовательности и быстрой математике вместо строковых операций.

def is_happy(n: int) -> bool:
while True:
if n == 1 or n == 7: # 7 -> 49 -> 97 -> ... -> 1
return True
if n < 10:
return False

next_n = 0
while n > 0:
digit = n % 10
next_n += digit * digit
n //= 10
n = next_n


🤔 В чем магия?
* Любая последовательность рано или поздно приходит к числу с одной цифрой.
* Из всех однозначных чисел только 1 и 7 в итоге приводят к 1. Все остальные попадают в цикл 4 -> 16 -> ... -> 4.
* Поэтому можно просто проверять эти конечные состояния.
* А использование математических операций n % 10 и n //= 10 для извлечения цифр, как правило, работает быстрее, чем преобразование в строку str(n).
13👍21🔥1🙏1🦄1
🗓Итоги месяца (июнь 2025)

👀 Топ по просмотрам 👨🏻‍💻
1️⃣ Статистика из США по высокой безработице среди выпускников IT-специальностей.
2️⃣ Утилита для исправление опечаток при помощи факов.
3️⃣ Новость о том, как в компании Canva теперь требуют использования AI-помощников.

📨 Топ по репостам 📥
1️⃣ Огромная подборка бесплатных тренажёров по SQL.
2️⃣ Релиз ИИ-помощника для командной строки Gemini CLI.
3️⃣ Релиз функционала подтверждения IT-компетенций на Госуслугах.

👍🏻 Топ по реакциям 😍
1️⃣ Как обычно, мемчик.
2️⃣ Сказ о том, как ИИ спас прогера-индуса от увольнения.
3️⃣ Исследование Mamba о том, что айтишники уже не в тренде привлекательности.
🙏21👍1🔥11
Прошёл очередной квартал, пора смотреть, что там с зарплатами питонистов по данным Getmatch 🤑

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

▪️ Медианная зарплата по всем уровням – 200к
▫️ Джуны – 100к
▫️ Мидлы – 190к
▫️ Синьоры – 300к
▫️ Тимлиды – 350к

▫️ В Москве медиана по всем уровням – 210к
▫️ Питер – 200к
▫️ Остальные города – 200к (было 180)

⬆️ Медиана по зарплатам для тех, кто работает в офисе или гибридно – 197к. Было 190, это единственный пункт с ростом.
▫️ Удалёнщики – 220к
👍32🔥1🙏11