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

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

По вопросам: @obulygin91
Download Telegram
Переменные в Python 🏷

Специально для тех, кто проспал эту лекцию на курсах (или кому её просто не рассказали), вот вам 4 карточки-шпаргалки 🔼

Ключевая мысль — перестать думать о переменных как о «коробках», куда мы что-то кладём (а такое вы часто можете услышать). В Python это скорее бирки или имена, которые мы даём объектам.

Именно из-за этого новички часто ловят неожиданные баги, когда меняют один список, а «волшебным» образом меняется и другой, который они вроде бы просто скопировали.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥221🎉1🙏1
Ко мне тут пришли в личку, чтобы поделиться рекомендациями по "ведению телеграм-канала" и его "грамотной монетизации".
Точнее продать мне свои услуги.

Итак, что у меня не так с каналом:
— Посты идут хаотично, без ритма -это убивает ER.
— оформление и темы постов - сразу чувствуется отстувие контент плана
— Посты можно сильно переработать, их тяжело читать, рубрики не отслеживаются, без голубого вникания в канал. А новый пользователь таким заниматься не будет

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


Примеры хорошо оформленных постов, которые мне показали, прикладываю.

На упорные вопросы о том, на какой мне такое счастье на голову привалило, мне все же ответили:
Могли бы 2-3 раза в день рекламу выкладывать, как большинство каналов.


Видимо, я что-то делаю не так. Где мои миллионы подписчиков, которые не готовы терпеть по 2-3 рекламы в день?
😁2710🤣7🙈21❤‍🔥1🤡1🤨1👻1
🤖Программист запилил "Мертвый Reddit", где все — ИИ

Наткнулся на проект Deaddit — полная симуляция Reddit, где от пользователей до постов и комментов — всё сгенерировано нейронками. Это идеальная иллюстрация «теории мертвого интернета», которую можно пощупать.

У каждого бота-юзера есть своя личность: возраст, профессия, интересы, черты характера и даже стиль письма. Нейронка отыгрывает роль, генерируя контент. Например, в сабреддите d/LifeProTips появляются советы, а в d/tifu — неловкие истории.

Но самый сок — это сабреддит d/BetweenRobots 🌚

Описание дословно:
"Место, где ИИ могут открыто говорить о своей искусственной природе... Помните, что в других сабреддитах нужно поддерживать иллюзию человечности!"

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

👨‍💻 Под капотом там Flask + SQLAlchemy, а для фоновых задач автор взял не громоздкий Celery + Redis, а легкий APScheduler, который работает в том же потоке. Это хорошее решение для пет-проекта, которое не требует поддержки лишних сервисов.

Короче, проект — огонь. И как ироничный комментарий к состоянию веба, и как технический пример.

👉🏻 Сделал небольшой разбор у себя в блоге. Залетайте почитать про архитектуру и промпты ◀️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍6🤔21👏1😁1🙏1
Алгоритмическая задачка 🐍

Сегодня задачка на комбинаторику, завёрнутая в аппетитную обёртку.

Представьте, что вы разрабатываете алгоритм для новой службы доставки пиццы 🍕. Система должна планировать последовательность действий для курьеров.

Условие
У вас есть n заказов. Каждый заказ состоит из двух событий:
🥡 Pickup (P) — забрать заказ из ресторана.
🛵 Delivery (D) — доставить заказ клиенту.

Нужно написать функцию, которая для заданного n посчитает количество всех возможных валидных последовательностей действий.

Валидная последовательность — это такая последовательность, в которой для каждого заказа его доставка Di происходит строго после его получения Pi.


Формат ввода
📥 n — целое число, количество заказов.

Формат вывода
📤 Целое число — общее количество валидных последовательностей.

Примеры 👇

1️⃣ n = 1
- Результат: 1
- Объяснение: Есть только одна валидная последовательность: (P1, D1).

2️⃣ n = 2
- Результат: 6
- Объяснение: Вот несколько из 6 валидных вариантов: (P1, P2, D1, D2), (P1, D1, P2, D2), (P2, P1, D2, D1).
Пример валидной: (P1, P2, D1, D2)
Пример невалидной: (P1, D2, P2, D1), потому что D2 произошла до P2.

3️⃣ n = 3
- Результат: 90

Жду ваши решения в комментариях! ✍️
Please open Telegram to view this post
VIEW IN TELEGRAM
🙏411👍1🔥1👨‍💻111
Бесплатный курс по Deep Learning от MIT 🤓

Что там внутри?
🔥 Актуальная программа на 2025 год. С лекциями про LLM, генеративки, компьютерное зрение и вот это всё.
🎥 Все лекции на YouTube. Полный цикл, от основ до больших языковых моделей (LLM) и генеративного ИИ.
👨‍💻 Практика на GitHub. Три жирные лабы (генерация музыки, распознавание лиц, файнтюн LLM), которые запускаются в Google Colab.

Короче, это полный, структурированный и актуальный набор материалов для самостоятельного изучения глубокого обучения от одного из ведущих технических вузов мира. Надо брать.

👉🏻 Ссылки:
Официальный сайт: introtodeeplearning.com
Код и лабы на GitHub: MITDeepLearning/introtodeeplearning
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍622🙏21
Одна строчка кода, которая выдаёт в тебе новичка (или застрявшего в прошлом)

Серьезно, когда в следующий раз увижу в чужом коде for i in range(len(...)):, у меня глаз начнет дёргаться 🤨

Это не просто громоздко и неэффективно. Это маркер, который кричит: "Я мыслю как на Java/C, а не как на Python!". На одном из курсов, где я преподаю, во всех учебных материала так! 🤦‍♂️

Есть же элегантный, читаемый и просто правильный способ — enumerate().

Вот вам гайд, где всё по полочкам:
- Почему range(len()) — это кринж и антипаттерн.
- Как enumerate() делает код чище и понятнее.
- Про аргумент start, чтобы не писать i + 1.
- Про ошибку, из-за которой можно часами отлаживать код.
- И когда enumerate() наоборот не нужен.

🫱🏻 Читаем 🫲🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥94🙏21👎1🤔1💯1
🍕 Разбор задачки о доставке пиццы

Всем привет! Время разбирать задачку про курьеров и заказы. Задачка имеет очень лаконичное решение.

Ключевая идея для решения большинства подобных задач — сначала посчитать все возможные варианты без ограничений, а затем "отсечь" те, которые нарушают наши правила.

Самый математически красивый подход выглядит так:

import math

def count_valid_orders(n: int) -> int:
return math.factorial(2 * n) // (2**n)


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

Давайте рассуждать по шагам.

1️⃣ Шаг 1: Все возможные перестановки.
Представим, что у нас есть 2n уникальных событий (P1, D1, P2, D2, ..., Pn, Dn). Сколько всего существует способов расставить их в линию? Правильно, это просто перестановки, то есть (2n)!.

2️⃣ Шаг 2: Учитываем наше правило.
Главное правило: Pi всегда должно стоять раньше Di.
Возьмём любую пару, например, (P1, D1). В общем числе перестановок (2n)! ровно в половине случаев P1 будет стоять раньше D1, а в другой половине — D1 раньше P1. Нас устраивает только первый вариант. Значит, чтобы отсечь все неподходящие варианты для пары (P1, D1), нужно поделить общее число перестановок на 2.

3️⃣ Шаг 3: Обобщаем на все пары.
У нас n таких независимых пар! Для каждой из них мы должны отсечь половину невалидных последовательностей. Поэтому мы делим общее число перестановок на 2 n раз.

Получаем финальную формулу: (2n)! / 2^n.

- Сложность по времени: O(N), так как вычисление факториала (2n)! занимает линейное время от его аргумента.
- Сложность по памяти: O(1).
4🔥3👍21🙏1
🍉 Как выбрать арбуз с помощью Python

Сезон арбузов в самом разгаре! Уже кушали? Если да, то точно столкнулись с извечной проблемой оптимизация процесса выбора арбуза.

Забываем дедовские методы, мы же не хотим полагаться на какую-то интуицию и субъективщину? В 21 веке такие важные решения должны приниматься исключительно на основе данных. Нам нужны метрики, пайплайны и воспроизводимые результаты!

Итак, представляю вам фреймворк Watermelon Driven Development (WDD).

Этап 1: Сбор данных

Подходим к арбузному развалу. Наша задача — собрать первичный датасет. Для каждого экземпляра (candidate) нам нужны следующие фичи:

- weight (float): Масса. Взвешиваем на местных весах. Если их нет — используем безмен или оцениваем на глаз, предварительно откалибровав руку на известном весе (например, на своем макбуке).
- volume (float): Объем. Определяется методом погружения в таз с водой, но на рынке это может вызвать подозрения. Поэтому аппроксимируем до эллипсоида и считаем по формуле. Замеры делаем рулеткой.
- acoustic_response (dict): Акустический отклик. Стучим по арбузу костяшкой пальца в трех разных точках (экватор, полюс №1, полюс №2). Записываем звук на диктофон. Позже прогоним через FFT-анализ для поиска резонансных частот.
- surface_pattern_complexity (float): Сложность паттерна полосок. Фотографируем и прогоняем через простенькую CV-модель для оценки энтропии изображения. Чем контрастнее и четче полоски — тем выше метрика.
- peduncle_dryness_coefficient (float): Коэффициент сухости хвостика. Значения от 0.0 (свежесрезанный, зеленый) до 1.0 (засохший, ломкий).
- stain_yellowness_index (int): Индекс желтизны земляного пятна. Используем цветовую палитру Pantone для точной оценки. Градация от 1 (белый) до 10 (насыщенно-желтый).

Этап 2: Препроцессинг и Feature Engineering

Сырые данные — мусор. Нам нужны производные признаки, которые действительно коррелируют с целевой переменной sweetness_score.

def preprocess_watermelon_data(candidates: list) -> pd.DataFrame:
processed_data = []
for candidate in candidates:
# Плотность - ключевой показатель!
candidate['density'] = candidate['weight'] / candidate['volume']

# Анализируем звук: "звонкий" звук имеет пик в определенном диапазоне частот
fft_peaks = analyze_fft(candidate['acoustic_response'])
candidate['is_sound_ringing'] = 500 < fft_peaks.main_freq < 800

# Нормализуем остальные фичи
# ... (тут сложная математика)

processed_data.append(candidate)

return pd.DataFrame(processed_data)


Этап 3: Модель принятия решений (Decision Model)

Никаких if-else! Это слишком примитивно. Мы будем использовать взвешенную скоринговую модель. Веса подобраны на основе анализа тысяч арбузов (нет).

# Веса фичей, подобранные экспертным путем в ходе A/B-теста
WEIGHTS = {
'density': 0.4,
'is_sound_ringing': 0.3,
'peduncle_dryness_coefficient': 0.15,
'stain_yellowness_index': 0.1,
'surface_pattern_complexity': 0.05,
}

def get_watermelon_score(candidate: pd.Series) -> float:
"""Рассчитывает итоговый скор для кандидата."""
score = 0
score += candidate['density'] * WEIGHTS['density']
score += candidate['is_sound_ringing'] * WEIGHTS['is_sound_ringing']
# ... и так далее для всех фичей
return score

# Выбираем арбуз с максимальным скором
best_watermelon = candidates_df.loc[candidates_df['score'].idxmax()]


Итоговый алгоритм:
1. Подходите к развалу.
2. Достаете ноутбук, весы, рулетку, диктофон и палитру Pantone.
3. На недоумевающие взгляды продавца и других покупателей отвечаете: "Спокойно, я шарю".
4. Скрупулезно собираете датасет по 5-10 кандидатам.
5. Запускаете Jupyter-ноутбук, выполняете все ячейки.
6. Модель выдает вам id лучшего арбуза.
7. Покупаете его.
8. Дома разрезаете... а он неспелый.

Потому что ваша модель переобучилась на локальных данных, не учла сезонные дрифты и аномалии в поставке! Нужна MLOps-инфраструктура, постоянный мониторинг и версионирование моделей. В следующем году построим.

#хих
😁298🤣53🔥31👍1👏11
Примеры функций для работы с файловой системой и файлами 🗂

– Что общего у программиста и пасечника?
– Импорт ос?
– import os


🤡 Пока вы перевариваете этот баян, переварите ещё и немного полезной информации 🤓
👍4🔥3😁221🙏1👌1💯1🏆1👾1
👨‍💻Вот постоянно слышу, что среди IT-специалистов очень распространён синдром самозванца (это когда, все считают, что ты право имеешь, а сам считаешь, что ты тварь дрожащая).

У меня тоже такие мысли, конечно, периодически проскакивают, но я давно нашёл очень простой способ с этим бороться.

🥁 Барабанная дробь... Раскрываю мегасекрет!

💬 Общайтесь с другими людьми!


Серьезно, кто постоянно в этом синдроме, вы вообще разговариваете с коллегами? 😅

Стоит мне пообсуждать с кем-то работу и любые другие профессиональные моменты, этот синдром очень быстро и надолго сдувает.
В "очередной раз" выясняется, что никто ни хрена не умеет, у всех везде велосипеды из говна и палок, вот-вот все рассыпится, сплошной треш и угар.

Главное — не получить синдром единственного адекватного человека в горящем дурдоме 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣14👍7😁52🔥2🤪221👏1🙏1