Skip Navigation
PythonTalk | Всё о Python
Telegram
PythonTalk | Всё о Python
5 274 подписчиков 29 постов Рейтинг 0,2

Привет, меня зовут Олег Булыгин 👋 🐍 Здесь я делюсь полезной информацией для тех, кто пишет код на Python: от разработки до Data Science. По вопросам: @obulygin91

Посты
pythontalk_ru
Наука и Технологии вчера
Telegram
Однострочный фетишизм 🤖
Однострочный фетишизм 🤖

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

with open("t") as f:print(sum([sum([float(m) for m in "".join(filter(lambda x:x.isnumeric() or x.isspace() or x==".",l)).split()]) for l in f.readlines()]))


🧐 Что здесь происходит?
Автор этого «шедевра» поставил себе задачу: извлечь все числа из текстового файла и просуммировать их.

Почему это вызывает физическую боль?
1️⃣ Память — не резиновая. f.readlines() вываливает весь файл в RAM. Если файл на 10 Гб — ваш сервер скажет «пока» быстрее, чем вы дочитаете этот пост.
2️⃣ Посимвольная фильтрация через lambda. Склеивать строку по одному символу через "".join(filter(...)) — это самый медленный способ обработки строк в Python. Мы тут программируем или бисер перебираем?
3️⃣ Вложенные списковые включения. Читаемость на уровне египетских иероглифов. Чтобы понять, где закрывается скобка, нужно вызвать экзорциста.
4️⃣ PEP8 вышел из чата. Отсутствие пробелов после : и вокруг операторов — это не экономия места, это неуважение к окружающим.

Итог: Мы получили код, который работает медленно, жрет память и абсолютно нечитаем.

Как это сделать по-человечески?
Если вам нужно вытащить числа из текста, для этого существуют регулярные выражения.
Вот как этот код должен выглядеть в мире здорового человека:

import re

def total_sum_from_file(file_path: str) -> float:
total = 0.0
# Используем контекстный менеджер и итератор по строкам
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
# Ищем все, что похоже на число (целое или с точкой)
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", line)
total += sum(map(float, numbers))
return total

print(total_sum_from_file("t.txt"))


Почему так лучше:
1. Читаемость: Даже джун поймет, что здесь происходит, за 5 секунд.
2. Память: Мы читаем файл построчно. Если файл весит 10 Гб, этот код не упадет.
3. Скорость: re.findall на уровне C работает быстрее, чем ваш посимвольный фильтр на Python.

#код_курильщика
pythontalk_ru
Наука и Технологии вчера
Telegram
Симулируем кожаных 👩‍👩‍👦


Симулируем кожаных 👩‍👩‍👦

У Microsoft есть интересный open-source проект — TinyTroupe. В чем суть? Большинство фреймворков заточены под assistance — помощь в решении задач. TinyTroupe заточен под симуляцию. Разница фундаментальная: ассистент должен быть эффективным, а симулятор — достоверным. Достоверный человек тупит, имеет предвзятость, помнит о завтраке и обладает характером.

Что внутри этого Python-зоопарка:
1. TinyPerson: У агента есть mental_faculty (когнитивные способности) и два вида памяти: EpisodicMemory (событийная цепочка) и SemanticMemory (база знаний и фактов).
2. Action Correction: Если LLM-агент внезапно «забывает» свою личность (например, веган начинает советовать стейк-хаус), система валидации TinyPersonValidator ловит это за руку, дает агенту по шапке и заставляет перегенерировать действие.
3. TinyWorld: Среда обитания. Здесь агенты взаимодействуют по правилам, которые вы описываете кодом. Можно задать даже социальную сеть с графами отношений.
4. TinyFactory: Генератор толпы. Если вам нужно 50 бразильских врачей, любящих тяжелый металл и экологию, для теста вашего нового приложения — фабрика их нашинкует по демографическим вводным.

Зачем это все?
Синтетические данные: Вместо того чтобы мучить реальных юзеров или покупать сомнительные датасеты, вы прогоняете проект через фокус-группу из 100 агентов с разными характерами.
Тестирование ПО: Можно заставить агента «пользоваться» вашим чат-ботом или поисковиком и смотреть, где он сломает логику своими человеческими ожиданиями.
Маркетинг: Оценка рекламы на симулированной аудитории до того, как вы сольете весь бюджет.

Внутри — типичный современный Python-стек: llama-index для RAG, chevron для шаблонов промптов и много-много JSON-спецификаций. Главный минус — по умолчанию все заточено под OpenAI.

Ну и кроме всего прочего, это доказательство, что мы живем в матрице 🌝

#годный_опенсорс
pythontalk_ru
Наука и Технологии 5 март
Telegram
Разбор: Охота на смайлики 🕵️‍♂️
Разбор: Охота на смайлики 🕵️‍♂️

Давай посмотрим на присланное решение:

import re

def num_emojis(arg):
return sum([re.match("^[:;][~-]?[)D]$",i) is not None for i in arg])


Работает? Да. Оставлять такое в проде? Нет.

1️⃣ Грех аллокации
Квадратные скобки внутри sum([ ... ]) означают, что Питон сначала создаст в памяти полный список из True/False размером с исходный массив, и только потом его просуммирует. Если на вход прилетит лог на 10 миллионов строк, ваша память выйдет из чата.
Убираем скобки — получаем генераторное выражение. Память O(1) вместо O(n).

2️⃣ Избыточные проверки
Конструкция match(...) is not None имеет право на жизнь, но в Питоне принято использовать встроенную "правдивость" (truthiness) объектов. Плюс, нам нужно просто посчитать количество совпадений. Идиоматичный подход: sum(1 for ... if ...)

3️⃣ Перекомпиляция
Вызов re.match внутри цикла каждый раз заставляет Python лезть в кэш регулярок. Если строк много, паттерн нужно компилировать один раз до цикла.

Выкидываем мусор и пишем так:
import re

# Выносим компиляцию наверх
SMILEY_PATTERN = re.compile(r"^[:;][~-]?[)D]$")

def count_smileys(faces: list[str]) -> int:
return sum(1 for face in faces if SMILEY_PATTERN.match(face))


☝️Но главная проблема этого решения не в синтаксисе.
Зачем нам вообще тут регулярки?

Давайте посчитаем: у нас 2 варианта глаз, 3 варианта носа (включая его отсутствие) и 2 варианта рта.
Существует ровно 12 валидных смайликов. Как и написал @archimage_wiz, вместо того чтобы на каждой строке запускать тяжелую машину состояний регулярных выражений, нам достаточно проверить вхождение строки в заранее подготовленное множество (set).

Поиск в множестве работает за константное время O(1) (это хэш-таблица).

Решение здорового человека:
from typing import List

VALID_SMILES = {
':)', ';)', ':-)', ';-)', ':~)', ';~)',
':D', ';D', ':-D', ';-D', ':~D', ';~D'
}

def num_emojis_pro(arr: List[str]) -> int:
return sum(s in VALID_SMILES for s in arr)


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

Сложные инструменты — это круто. Но умение обходиться простыми — это уже скилл.

#алгособес
pythontalk_ru
Наука и Технологии 5 март
Telegram
Тетрис на Python: классика жанра или архитектурный хоррор?


Тетрис (ну и Змейка) — это «Hello World» в мире геймдева. Казалось бы, испортить его сложно, но автор этого репозитория очень старался. Разбираем проект, который преподносится как «обучающий материал для начинающих». Да, код рабочий, проект законченный, даже видео на YouTube есть. Но на деле там учат вредным привычкам.

1️⃣ Отсутствие точки входа
В main.py код просто навален в корень файла. Никакого if __name__ == "__main__":. Если вы попробуете импортировать что-то из этого файла (хотя зачем?), у вас сразу инициализируется Pygame и откроется окно.

2️⃣ Беда с пространством имен
В game.py мы видим прекрасное: from blocks import *.
Запомните: каждый раз, когда вы используете import *, вы забиваете пространство имен мусором. Какие классы прилетели? Откуда? Никто не знает.

3️⃣ Класс-оркестр
Класс Game — это и швец, и жнец. Он управляет логикой, считает очки, загружает звуки, проигрывает музыку и... отрисовывает блоки.
Нарушение SRP (Single Responsibility Principle) на лицо. Логика игры не должна знать о существовании pygame.mixer или о том, как рисовать прямоугольники.

# В недрах Game.__init__
self.rotate_sound = pygame.mixer.Sound("Sounds/rotate.ogg")
pygame.mixer.music.load("Sounds/music.ogg")

Хотите поменять звуковую библиотеку? Удачи переписывать всё ядро игры.

4️⃣ ООП головного мозга: Наследование ради... ничего
В blocks.py мы видим классическую ошибку: создание семи разных классов (LBlock, JBlock и т.д.), которые наследуются от Block только ради того, чтобы в __init__ вписать словарик с координатами.

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

Как надо: Один класс Block, который принимает тип фигуры или конфиг при инициализации. Данные отдельно, логика отдельно.

5️⃣ Класс Position — зачем?
class Position:
def __init__(self, row, column):
self.row = row
self.column = column

Создавать целый класс для хранения двух целых чисел — это избыточно. В Python есть namedtuple, dataclasses или, в конце концов, просто кортежи (row, col).

6️⃣ Магические числа и хардкод
if self.next_block.id == 3:
self.next_block.draw(screen, 255, 290)
elif self.next_block.id == 4:
self.next_block.draw(screen, 255, 280)

Это «костыльный» UI в чистом виде. Вместо того чтобы вычислить центр области предпросмотра, автор просто подогнал координаты под конкретные ID блоков. Добавите новый блок — и вся верстка поплывет.

7️⃣ Обработка счета из эпохи мамонтов
В game.py мы видим это:

def update_score(self, lines_cleared, move_down_points):
if lines_cleared == 1:
self.score += 100
elif lines_cleared == 2:
self.score += 300
# ... и так далее


Как надо: Обычный словарь или список коэффициентов сделал бы этот код в одну строку. elif-цепочки для простых соответствий — верный признак того, что автор не умеет в структуры данных.

🧑‍⚖️ Вердикт:
Как учебный проект — пойдет. Если учитесь по таким туториалам, помните: их цель — показать результат за 20 минут видео, а не научить вас писать нормальный код. Не тащите эти паттерны в продакшен.

#жарим_код
pythontalk_ru
Наука и Технологии 4 март
Telegram
Охота на смайлики 😀
Сегодня очередная классика.
Задача:
Написать функцию, которая принимает на вход список строк и возвращает число равное количеству смайликов в этом списке.

Что считаем смайликом:
🟢у смайлика обязательно должны быть глаза. Варианта 2: : и ;
🟢у смайлика может быть нос (а может и не быть). Носы такие: - и ~
🟢 смайлик должен улыбаться (грустные не принимаются!), улыбки такие: ) и D
🟢если в строке есть ещё что-то кроме этого, то это уже не смайлик.

Примеры для проверки:
[':)', ';(', ';}', ':-D']       # -> 2
[';D', ':-(', ':-)', ';~)`] # -> 3
[';]', ':[', ';*', ':$', ';-D'] # -> 1


Варианты решений кидайте в комменты 👇

#алгособес
pythontalk_ru
Наука и Технологии 4 март
Telegram
Даем LLM руки: пишем агентов с инструментами 🛠


Даем LLM руки: пишем агентов с инструментами 🛠

В реальности LLM сама по себе — это просто мозг в банке. Она может придумать план захвата мира, но не может даже узнать погоду за окном или посчитать 2 + 2 без галлюцинаций. Чтобы превратить болталку в полезный инструмент, ей нужны Tools (инструменты) и Agentic Loop (агентный цикл).

🗓 Сегодня в 18:00 МСК в «Точке Сборки» будем разбираться, как научить LLM ходить в интернет, дергать сторонние API и исполнять функции.

Стек: Python, LangChain, Mistral AI.

🤓 Что нужно знать:
Базовый Python и основы взаимодействия с LLM по API.

⏩ Залетайте в Точку Сборки
pythontalk_ru
Наука и Технологии 3 март
Telegram
Где искать живые API?


Бесплатные API живут по закону джунглей: сегодня он есть, завтра лимит в 10 запросов в час, послезавтра владелец все удалил, потому что задолбался платить за хостинг.

Сервис Free Public APIs содержит неплохую актуализируемую подборку бесплатных апишек. От банальных курсов валют и погоды до более специфичных вещей: проверка на фишинг, распознавание лиц, базы данных по аниме и данные по авиарейсам.

Удобно, что сайт проверяет статус каждой апишки. Если сервис падает или превращается в тыкву — он теряет рейтинг и вылетает из выдачи.

Для пет-проектов и тренировки джунам — мастхэв.

#тулбокс
pythontalk_ru
Наука и Технологии 3 март
Telegram
Что гуглят будущие Senior-разработчики 🫠
Что гуглят будущие Senior-разработчики 🫠

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

Топ дичи в этот раз такой (в запросы вшиты ссылки на материал, на который в итоге перешли):

1️⃣ в питоне не читается логический оператор and заявления томск
Баг оказался настолько критичным, что разработчик решил не дебажить, а сразу пошел писать заявление в районное отделение полиции. Надеюсь, оператор and уже дает показания.

2️⃣ gpt oss xxx контент
Истинный двигатель опенсорсного ИИ. Пока корпорации закручивают гайки цензуры, энтузиасты разворачивают локальные модели на 120B параметров с одной абсолютно понятной целью.

3️⃣ как сделать саморазвивающийся ии который будет играть в игры на пайтон
Амбиции уровня "Скайнет за выходные на коленке".

4️⃣ есть ли в пупке узелки python
Автозамена беспощадна. Видимо, кто-то пытался нагуглить "узлы в графе/дереве", но случайно открыл совершенно новую ветвь IT-анатомии.

5️⃣ регрессия пайтон прошу помощь люди часто
Человек буквально кричит в строку поиска Яндекса. Надеюсь, поисковик вызвал ему скорую алгоритмическую помощь, иначе парня мы потеряли.

6️⃣ что надо написать что бы когда c = a+b то писалось true а когда нет false подписку новокузнецк
Оператор сравнения == в этом таймлайне изобретут только в 2027 году. А пока оформляем подписку Новокузнецк.

7️⃣ как заставить ии делать ставки
Эволюция моих любимых vibe-инвесторов из прошлых выпусков. Зачем учить матстат, если можно написать терминатора-лудомана из говна и палок, который проиграет твою квартиру в онлайн-казино в автоматическом режиме?

8️⃣ QWEN ипишит код на путоне
Ипишит. На путоне. Идеальное описание того, как большинство сейчас использует LLM. Нейросети развиваются явно быстрее, чем орфография промпт-инженеров.

9️⃣ что значит or () женщины
Логические операторы Python бессильны перед женской логикой.

😱 олег булыгин заработок
Перед налоговой отчитался! 🫡

Внимание, вопрос! Когда там нас заменит искусственный интеллект? Это ведь невозможно!

#хих
pythontalk_ru
Наука и Технологии 2 март
Telegram
📑 Google поясняет за AI-агентов


📑 Google поясняет за AI-агентов

У Google есть 42-страничный учебник, который, по сути, является мануалом по архитектуре современных LLM-приложений.

Что внутри интересного:

1️⃣ Анатомия агента: Четкое разделение на Модель, Инструменты (Tools) и Оркестрацию. Google на пальцах (и диаграммах) показывает, чем агент отличается от простого вызова API модели. Спойлер: наличием цикла восприятия-действия.

2️⃣ Reasoning Frameworks: Если вы не понимаете разницу между ReAct, Chain-of-Thought (CoT) и Tree-of-Thoughts, там это разжевано.

3️⃣ Extensions vs Functions: полезная часть для инженеров.
Extensions: Агент сам дергает API (Agent-side execution).
Functions: Агент говорит вам, какие параметры нужны, а код выполняется на клиенте (Client-side execution).

4️⃣ RAG и Data Stores: Как прикрутить векторные базы и не облажаться с контекстом.

Естественно, все примеры на Python. Показывают интеграцию как с нативными инструментами Vertex AI, так и с LangChain / LangGraph.

🔗 Забирать тут 🫲🏻

#левел_ап
pythontalk_ru
Наука и Технологии 2 март
Telegram
MRO в Python 🧬


MRO в Python 🧬

Если вас спросят, как Python ищет методы в «ромбовидной» иерархии, и вы ответите «сначала в глубину» (DFS) или «сначала в ширину» (BFS) — вы ошиблись. Оба ответа технически неверны для Python 3.

Разбираем анатомию Method Resolution Order:
💎 Diamond Problem: Почему порядок наследования может быть критически важен.
💎 Как работает алгоритм C3 Linearization.
💎 Миф о super(): почему это не всегда «вызов родителя».

Листайте, чтобы понять, почему ваши миксины работают не так, как вы планировали 👉

#анатомия_питона

Управлять можно с клавиатуры

Работает в лентах: голосование, переход между постами и разворот текста.

W
S
A
D
F
Топ авторов за месяц
Свежие комментарии