Python: задачки и вопросы (@quiz_python) — Telegram-канал | Telegram Dialogs
Все каналы
Python: задачки и вопросы

Python: задачки и вопросы

@quiz_python

7K подписчиков технологии 💬 Комментарии открыты

Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media

Последние публикации

Python: задачки и вопросы
20.07.2026 16:06 · 👁 246
Напишите бэкенд онлайн-кинотеатра из 10+ микросервисов за 6 месяцев: 🤯 админка и ETL из PostgreSQL в Elasticsearch (Django, Docker, nginx); 🤯 асинхронный API поиска по базе фильмов (AsyncIO, FastAPI, Redis); 🤯 сервис авторизации: OAuth 2.0, OpenID, JWT; 🤯 UGC под большой поток событий: Kafka, ClickHouse, ELK, CI на GitHub Actions; 🤯 нотификации через RabbitMQ. Это программа курса «Мидл Python-разработчик» от Практикума PRO. Каждый модуль — отдельный сервис с новым стеком. Плюс Kubernetes: развернёте кластер и повесите Prometheus с Grafana на свои сервисы. Сам Python тут почти не преподают: предполагается, что язык вы знаете. Учат тому, чего не даёт маленький или узкоспециализированный проект: архитектура, отказоустойчивость, OLTP/OLAP, масштабирование. Итоговый проект — это онлайн-кинотеатр, доработанный сервисом на выбор (например, голосовым помощником), с защитой перед архитектурным комитетом. Кому подойдёт: у вас есть больше года коммерческой разработки на Python, знакомы с SQL и Linux; вы готовы к нагрузке в 15–20 часов в неделю (выпускники называют это второй работой). 💻 Проверьте свой уровень на входном тестировании: https://tprg.ru/QGe1 Реклама. Рекламодатель: АНО ДПО "Образовательные технологии Яндекса" ИНН 7704282033, erid: 2W5zFH6Ppp1
Python: задачки и вопросы
20.07.2026 11:08 · 👁 287
Развёрнутое пояснение: 1. Вызов fetch() входит в блок try. 2. В try возникает исключение ValueError('fail'). 3. Перед завершением функции выполняется блок finally. 4. В finally встречается return 'ok', который подавляет исключение и возвращает это значение. 5. print(fetch()) печатает ok. Почему это важно: return, break или continue в finally могут скрыть ошибки, поэтому cleanup-код не должен возвращать значений или прерывать поток управления.
Python: задачки и вопросы
18.07.2026 15:18 · 👁 316
Развёрнутое пояснение: 1. В main сначала вызывается create_task(f(2)), поэтому задача для f(2) встаёт в очередь цикла событий первой. 2. Затем вызывается create_task(f(1)), и задача для f(1) становится второй в очереди. 3. await t1 отдаёт управление циклу событий, который начинает выполнять отложенные задачи в порядке их постановки. 4. Сначала запускается f(2): она печатает 2, затем await asyncio.sleep(0) приостанавливает её. 5. Пока f(2) ждёт, цикл переключается на f(1), печатает 1 и тоже засыпает на 0. 6. Когда sleep(0) завершается, задачи просыпаются в том же порядке: f(2) печатает 12, затем f(1) печатает 11. 7. await t1 и await t2 завершаются, так как обе задачи уже выполнены. В stdout оказывается 2, 1, 12, 11. Почему это важно: в асинхронных сервисах create_task лишь планирует задачу, а не запускает её мгновенно. Порядок выполнения определяется очередью событий, поэтому await в конце не меняет порядок, заданный при создании задач. Это помогает избежать неожиданного порядка вызовов при инициализации ресурсов, логировании или конкурентной обработке событий.
Python: задачки и вопросы
17.07.2026 09:54 · 👁 332
Развёрнутое пояснение: 1. Создаём множество с тремя объектами: 1 (int), 1.0 (float), True (bool). 2. Python сначала сравнивает хэши: hash(1), hash(1.0) и hash(True) равны. 3. При совпадении хэшей множество проверяет равенство через ==: 1 == 1.0 == True возвращает True. 4. Все три значения признаются дубликатами, и в множестве остаётся только первый вставленный элемент — 1. 5. print(len(data)) выводит 1. Почему это важно В ETL-пайплайнах такое поведение приводит к потере строк: дедупликация ключей int/float/bool или группировка по ним сворачивает разные сущности в одну. Поэтому в ключах явно приводят типы и не смешивают bool с числами. 💻 ETL-автоматизация — это только один из этапов разработки архитектуры данных. Если хотите системно разобраться в этой сфере, посмотрите программу Инженер данных от Практикума PRO. Вы сделаете 8 проектов, в рамках которых научитесь обрабатывать данные разными инструментами, проектировать пайплайны, создавать витрины и хранилища. Обратите внимание, что курс на полгода и он не для начинающих: вам понадобятся уверенные знания Python и SQL. Реклама. Рекламодатель: АНО ДПО "Образовательные технологии Яндекса" ИНН 7704282033, erid: 2W5zFJBoozq
Python: задачки и вопросы
16.07.2026 15:13 · 👁 323
Развёрнутое пояснение: 1. Определяется класс Field с методами __set__ и __get__, что делает его дескриптором данных. 2. Класс Record получает атрибут класса value, равный экземпляру Field. 3. Создаётся r = Record(). 4. Присваивание r.value = 3 вызывает дескрипторный метод __set__, который записывает в r._val значение 3 * 10, то есть 30. 5. Прямая запись r.__dict__["value"] = 9 помещает 9 в словарь экземпляра, но не вызывает дескриптор и не заменяет атрибут класса. 6. При чтении r.value правило поиска атрибутов в Python сначала проверяет дескриптор данных в классе; он находит value = Field() и вызывает его __get__, возвращающий r._val, равное 30. 7. Значение 9 из __dict__ остаётся недоступным через обычный доступ r.value, пока дескриптор с __set__ существует. Почему это важно: В ORM, валидаторах и property с setter часто скрывают хранение значения за дескрипторами. Ошибка возникает, когда разработчик пишет obj.__dict__["field"] =... или сериализатор заполняет словарь напрямую, ожидая, что это эквивалентно obj.field =.... В действительности дескриптор данных переопределяет чтение, поэтому тесты могут показать одно значение, а обычный доступ — другое. Понимание приоритета дескрипторов помогает избежать рассинхронизации между внутренним хранилищем и публичным интерфейсом.
Python: задачки и вопросы
16.07.2026 07:49 · 👁 318
Развёрнутое пояснение: 1. Создаётся u с id=1; его __hash__ возвращает 1. 2. Словарь d помещает пару u: 'a' в корзину для хэша 1. 3. u.id меняется на 2; сам объект u всё ещё лежит в корзине 1, потому что словарь не пересчитывает хэш. 4. d.get(User(2)) вычисляет хэш нового объекта — 2 — и ищет в корзине 2. 5. В корзине 2 ничего нет, поэтому возвращается None. Почему это важно: ключи dict и элементы set должны быть неизменяемыми относительно величины, участвующей в __hash__. Если объект-ключ мутирует, он остаётся в старой корзине, и поиск по новому хэшу его не найдёт. Это приводит к утечкам в кэшах, потере данных в индексах и нестабильным тестам при использовании изменяемых сущностей в качестве ключей.
Python: задачки и вопросы
15.07.2026 17:44 · 👁 305
Развёрнутое пояснение: 1. grid = [[0] * 3] * 3 создаёт один внутренний список [0, 0, 0] и трижды копирует ссылку на него, так что все три строки указывают на один объект. 2. grid[0][0] = 1 через первую ссылку изменяет этот общий список, поэтому у любой строки значение в позиции 0 становится равно 1. 3. print(grid) печатает один и тот же изменённый список три раза: [[1, 0, 0], [1, 0, 0], [1, 0, 0]]. Почему это важно Такая ловушка встречается при инициализации DP-таблиц, матриц смежности или игровых полей. Если написать [[0] * n] * m, любая запись в ячейку размножается по всем строкам, и алгоритм начинает работать с испорченными данными. Правильный способ — [[0] * n for _ in range(m)]: здесь каждая строка создаётся отдельным выражением и живёт своим объектом. 💻 Это различие между копией ссылки и копией объекта — базовая часть работы с массивами и алгоритмами на них. Такие паттерны, сложность операций и подготовку к алгоритмическим собеседованиям разбирают в Практикуме PRO на курсе Алгоритмы и структуры данных: 4 месяца, 100+ задач и пробное интервью. Реклама. Рекламодатель: АНО ДПО "Образовательные технологии Яндекса" ИНН 7704282033, erid: 2W5zFK6uaWV
Python: задачки и вопросы
15.07.2026 14:39 · 👁 298
Развёрнутое пояснение: 1. Создаём defaults = {'theme': 'light'}. 2. Создаём пустой user = {}. 3. ChainMap(user, defaults) формирует цепочку поиска: сначала user, затем defaults. 4. Чтение config['theme'] не находит ключ в user и возвращает 'light' из defaults. 5. Запись config['theme'] = 'dark' всегда изменяет первый словарь цепочки, то есть user. 6. В user появляется {'theme': 'dark'}, а defaults остаётся {'theme': 'light'}. 7. print(defaults['theme']) выводит 'light'. Почему это важно: ChainMap удобен для многоуровневых настроек — базовые значения, пользовательские, аргументы командной строки. Важно помнить, что присваивание пишет только в первый словарь, иначе можно случайно изменить общие дефолты или, наоборот, удивиться, почему изменение не дошло до последующих читателей конфига.
Python: задачки и вопросы
13.07.2026 18:53 · 👁 376
Развёрнутое пояснение: 1. Создаётся словарь d с ключами 'a' и 'b'. 2. Запускается цикл for key in d. Python создаёт итератор словаря, который фиксирует его текущий размер. 3. На первой итерации key равно 'a'. Выполняется d['a_copy'] = 1, и размер словаря увеличивается. 4. Когда цикл пытается перейти к следующей итерации, итератор обнаруживает изменение размера и выбрасывает RuntimeError: dictionary changed size during iteration. 5. Программа завершается с этой ошибкой, print(d) не выполняется. Почему это важно: при обработке конфигов, метрик или логов часто хочется на ходу добавлять производные ключи в тот же словарь, но это приводит к падению. Правильный путь — собирать изменения в отдельную структуру, а затем обновлять оригинал.
Python: задачки и вопросы
11.07.2026 14:15 · 👁 469
Развёрнутое пояснение: 1. fix(fn) вызывает fn один раз и сохраняет результат в v. 2. fix возвращает lambda, которая всегда отдаёт это же значение v. 3. buf указывает на lambda, а значит все вызовы buf() возвращают один и тот же список. 4. test_a получает этот список, добавляет в него 'a' и печатает ['a']. 5. test_b получает уже изменённый тот же список, добавляет 'b' и печатает ['a', 'b']. Почему это важно В pytest фикстура со scope='module' или scope='session' создаёт один объект на все тесты модуля или сессии. Если фикстура отдаёт изменяемый объект — список, словарь, множество, — мутации в одном тесте протекают в другие. На проде это выглядит как flaky-тесты: локально всё зелёное, в CI падает из-за другого порядка, или тесты проходят только по отдельности. Это ложно-зелёный сигнал, который подрывает доверие к регрессии. Причина обычно в неверном scope фикстуры. Правильный подход: scope='function' для изолированных данных, а общие ресурсы делать неизменяемыми или копировать перед использованием. 💻 На практике такие кейсы разбирают в курсе Практикума PRO «Автоматизатор тестирования на Python»: поймёте фикстуры, их scope, изоляцию состояния между тестами и уровни покрытия. Реклама. Рекламодатель: АНО ДПО "Образовательные технологии Яндекса" ИНН 7704282033, erid: 2W5zFGUXzho
Чат поддержки
Ответим здесь же, обычно быстро
Здравствуйте! Напишите ваш вопрос — оператор ответит в этом чате.