Веб-версияОткрыть в Telegram
PPython: задачки и вопросы

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

@quiz_python · канал · Технологии · в индексе с 2026-05-24
6 904подписчиков−17 за неделю
258средний охват поста
3.7%ER — охват к подписчикам
27постов за 30 дней
Python: задачки и вопросы
ОтветОпрос
Развёрнутое пояснение: 1. Вызывается persist_order, и блок try печатает строку write. 2. Инструкция raise создаёт исключение TimeoutError, после чего управление обязательно переходит в блок finally. 3. Блок finally печатает release и выполняет return со значением queued. 4. Этот return завершает функцию обычным образом и подавляет ещё не обработанное исключение TimeoutError. 5. Внешний print получает строку queued и печатает её, поэтому итоговый вывод состоит из write, release и queued. Почему это важно Задача относится к управлению исключениями и освобождению ресурсов. return внутри finally может незаметно скрыть сбой базы данных, из-за чего вызывающий код сочтёт операцию успешной. В прикладном коде блок finally обычно оставляют для очистки, а результат возвращают вне него.
1 · 293 ·
P
ОтветОпрос
Развёрнутое пояснение: 1. make_handlers создаёт пустой список handlers. 2. Цикл дважды присваивает переменной status значения 'new' и 'done'. 3. На каждой итерации создаётся lambda, но текущее значение status внутрь неё не копируется. 4. После цикла обе функции обращаются к одной переменной status, сохранившей последнее значение 'done'. 5. Последовательный вызов обработчиков поэтому возвращает список ['done', 'done']. Почему это важно Задача относится к позднему связыванию имён в замыканиях. Такая ситуация встречается при создании обработчиков событий и отложенных задач в цикле: без отдельной фиксации значения все обработчики могут работать с последним элементом.
285 ·
Python: задачки и вопросы
Опрос
нажмите — покажем
263 ·
ОтветОпрос
Развёрнутое пояснение: 1. Вызывается load_config, управление переходит в блок try. 2. Первый print выводит строку read. 3. Инструкция raise создаёт ValueError, но перед выходом из функции обязательно выполняется блок finally. 4. В finally сначала выводится cleanup, затем return возвращает словарь с режимом safe и одновременно отменяет распространение ValueError. 5. Вызов load_config успешно завершается, словарь присваивается переменной config. 6. Последний print получает значение по ключу mode и выводит safe, поэтому итоговый stdout состоит из строк read, cleanup и safe. Почему это важно: задача проверяет управление потоком при сочетании исключений и finally. В загрузчиках конфигурации, транзакциях и очистке ресурсов return внутри finally может скрыть исходную ошибку, из-за чего система продолжит работу с резервным результатом без ожидаемого сообщения о сбое.
245 ·
P
ОтветОпрос
Развёрнутое пояснение: 1. Вызов build_batch создаёт генератор, но его тело пока не исполняется. 2. list начинает потреблять этот генератор, и build_batch передаёт управление load_orders через yield from. 3. load_orders выдаёт строку order-1, поэтому она попадает в список, собираемый функцией list. 4. Затем load_orders выполняет return 1: для генератора это завершение со значением 1, а не выдача ещё одного элемента. 5. yield from извлекает это значение завершения и присваивает его переменной loaded. 6. Внутренний print выводит loaded 1, после чего build_batch завершается. 7. list возвращает список из единственного выданного элемента, и внешний print выводит ['order-1'] второй строкой. Почему это важно Задача относится к делегированию генераторов. Значение return вложенного генератора можно использовать как итог обработки, например как число загруженных записей, но оно не становится элементом ленивого потока.
1 · 269 ·
Python: задачки и вопросы
Опрос
нажмите — покажем
252 ·
ОтветОпрос
Развёрнутое пояснение: 1. В defaults создаётся словарь, где ключ retry ссылается на вложенный словарь со значением limit, равным 3. 2. Метод defaults.copy создаёт новый внешний словарь worker. 3. Вложенный словарь не копируется: значения defaults["retry"] и worker["retry"] ссылаются на один объект. 4. Присваивание через worker меняет limit в этом общем вложенном словаре на 5. 5. Поэтому обращение через defaults видит то же изменение, и print выводит 5. Почему это важно Это различие между поверхностным и глубоким копированием. Оно встречается при создании рабочих конфигураций из шаблона: изменение вложенного раздела поверхностной копии может незаметно изменить исходные настройки и повлиять на другие обработчики.
234 ·
P
ОтветОпрос
Развёрнутое пояснение: 1. При входе в блок with вызывается метод __enter__, который печатает begin. 2. Тело блока печатает write, после чего возбуждает исключение ValueError. 3. Перед выходом из блока Python вызывает __exit__ и передаёт ему тип, значение и трассировку исключения. 4. __exit__ печатает имя типа исключения — ValueError — и возвращает True. 5. Истинное возвращаемое значение сообщает Python, что исключение обработано, поэтому строка после блока выполняется и печатает continued. Итоговый вывод: begin, write, ValueError и continued на отдельных строках. Почему это важно Задача проверяет протокол менеджеров контекста. На практике __exit__ часто освобождает соединения, завершает транзакции и управляет распространением ошибок; случайное возвращение истинного значения может скрыть сбой и позволить программе продолжить работу с некорректным состоянием.
246 ·
Python: задачки и вопросы
Опрос
нажмите — покажем
255 ·
ОтветОпрос
Развёрнутое пояснение: 1. asyncio.run запускает цикл событий и начинает выполнять main. 2. Первый вызов create_task планирует задачу db, но send ещё не начинает исполняться, поскольку main пока не передал управление циклу событий. 3. Второй вызов create_task аналогично планирует задачу log. 4. На await db функция main приостанавливается, и цикл событий запускает запланированные задачи в порядке их постановки. 5. Задача db печатает send db и приостанавливается на asyncio.sleep(0). 6. Затем задача log печатает send log и тоже приостанавливается. 7. После завершения db ожидание в main заканчивается, и main печатает saved. Поэтому строки выводятся в порядке send db, send log, saved. Почему это важно: create_task запускает конкурентную задачу при ближайшей передаче управления циклу событий. Ожидание одной задачи не мешает другим уже запланированным задачам начать работу, что важно учитывать при отправке данных, обновлении метрик и обработке очередей.
1 · 235 ·
P
ОтветОпрос
Развёрнутое пояснение: 1. Для класса Client строится порядок разрешения методов: Client, Audit, Retry, Base, object. 2. Вызов send сначала находит реализацию в Audit, которая создаёт список с элементом audit. 3. super() внутри Audit продолжает поиск после Audit, поэтому вызывает Retry.send, а не Base.send напрямую. 4. Retry добавляет retry и через свой super() передаёт управление методу Base.send. 5. Base.send возвращает список с base; результаты последовательно объединяются, поэтому вывод равен ['audit', 'retry', 'base']. Почему это важно: задача проверяет кооперативное наследование и порядок разрешения методов. Такой подход применяется в примесях для журналирования, повторных попыток и проверки доступа; каждый класс должен передавать управление через super(), чтобы вся цепочка выполнилась.
229 ·
Python: задачки и вопросы
Опрос
нажмите — покажем
1 · 236 ·
ОтветОпрос
Развёрнутое пояснение: 1. Создаётся контекстная переменная request_id без значения по умолчанию. 2. В задаче main переменной request_id присваивается значение A. 3. asyncio.create_task создаёт задачу audit и копирует в неё текущий контекст, где request_id равен A. 4. Затем main меняет request_id на B только в собственном контексте. 5. Когда запускается audit, она читает свою копию контекста и печатает A. Почему это важно ContextVar применяется для хранения идентификаторов запросов, данных трассировки и другого состояния асинхронной операции. Контекст задачи фиксируется при её создании, поэтому изменение переменной перед фактическим запуском задачи не обновляет уже скопированный контекст.
1 · 224 ·
P
ОтветОпрос
Развёрнутое пояснение: 1. defaultdict(int) создаёт словарь, в котором фабрика int возвращает 0 для отсутствующего ключа. 2. Выражение errors['api'] += 1 сначала получает значение 0, увеличивает его и сохраняет 1 для ключа 'api'. 3. Обращение errors['db'] не вызывает KeyError: defaultdict вызывает int без аргументов, получает 0 и добавляет пару 'db': 0. 4. Первый print выводит 0, а второй — обычное представление словаря с ключами в порядке их добавления: {'api': 1, 'db': 0}. Почему это важно Задача относится к поведению defaultdict при чтении отсутствующих ключей. В счётчиках метрик простая проверка значения может незаметно изменить словарь, создать лишние записи и повлиять на последующую сериализацию или обход данных.
241 ·
Python: задачки и вопросы
Опрос
нажмите — покажем
204 ·
ОтветОпрос
Развёрнутое пояснение: 1. deque создаёт очередь из a и b с максимальной длиной 3. 2. append добавляет c справа, и очередь становится [a, b, c]. 3. Добавление d превышает maxlen, поэтому deque автоматически удаляет a слева и сохраняет [b, c, d]. 4. popleft извлекает b, после чего в очереди остаются c и d. 5. print выводит извлечённое значение b и список ['c', 'd'], поэтому получается b ['c', 'd']. Почему это важно: ограниченный deque применяется для буферов, журналов последних событий и очередей с фиксированной ёмкостью; при переполнении он не создаёт исключение, а незаметно вытесняет старые данные.
228 ·
P
ОтветОпрос
Развёрнутое пояснение: 1. При создании класса __slots__ разрешает экземплярам хранить атрибут lines, но не создаёт для них словарь __dict__. 2. Декоратор cached_property заменяет метод total дескриптором, который должен один раз вычислить результат и записать его в __dict__ экземпляра. 3. Конструктор успешно сохраняет переданный список в предусмотренный слот lines. 4. При чтении total дескриптор сначала пытается получить __dict__ объекта для будущей записи кэшированного значения. До вызова функции с sum дело не доходит. 5. Поскольку у экземпляра нет __dict__, cached_property возбуждает TypeError. Аргумент print не вычислен, поэтому в стандартный вывод ничего не попадает. Почему это важно Задача относится к взаимодействию дескрипторов и модели хранения атрибутов. В проектах __slots__ применяют для сокращения памяти, а cached_property — для ленивых вычислений. Их прямое сочетание требует добавить __dict__ в __slots__ либо выбрать другой способ хранения кэша.
295 ·
Python: задачки и вопросы
Опрос
нажмите — покажем
227 ·
P
ОтветОпрос
Развёрнутое пояснение: 1. Создаётся функция load_rate, которая при вызове печатает строку «резерв» и возвращает 99. 2. В словарь rates записывается существующий тариф standard со значением 10. 3. Перед вызовом rates.get Python вычисляет все переданные аргументы, включая выражение load_rate(). 4. load_rate печатает «резерв» и возвращает 99, которое становится запасным значением для get. 5. Метод get находит ключ standard, поэтому возвращает 10, а уже вычисленное запасное значение 99 не использует. 6. Последний print выводит 10, поэтому итоговый вывод состоит из строк «резерв» и «10». Почему это важно Задача проверяет порядок вычисления аргументов функции. В реальном проекте передача затратной загрузки или запроса к резервному сервису прямо в dict.get может выполнять лишнюю работу даже при наличии ключа. Для ленивого получения запасного значения сначала проверяют наличие ключа или используют другую явную ветвь выполнения.
231 ·

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем