Python: задачки и вопросы
6.93K subscribers
1.35K photos
1 video
1 file
126 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
А вы уже забрали свой подарок ко Дню программиста?

Мы в Tproger вместе с нашими друзьями собрали целую коробку подарков к вашему профессиональному празднику. Переходите по ссылке, трясите коробку и забирайте свой презент: https://tprg.ru/pLwZ
Please open Telegram to view this post
VIEW IN TELEGRAM
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 обычно оставляют для очистки, а результат возвращают вне него.
2
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Python: задачки и вопросы
Развёрнутое пояснение:

1. make_handlers создаёт пустой список handlers.

2. Цикл дважды присваивает переменной status значения 'new' и 'done'.

3. На каждой итерации создаётся lambda, но текущее значение status внутрь неё не копируется.

4. После цикла обе функции обращаются к одной переменной status, сохранившей последнее значение 'done'.

5. Последовательный вызов обработчиков поэтому возвращает список ['done', 'done'].

Почему это важно

Задача относится к позднему связыванию имён в замыканиях. Такая ситуация встречается при создании обработчиков событий и отложенных задач в цикле: без отдельной фиксации значения все обработчики могут работать с последним элементом.
1
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Python: задачки и вопросы
Развёрнутое пояснение:

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 может скрыть исходную ошибку, из-за чего система продолжит работу с резервным результатом без ожидаемого сообщения о сбое.
2
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Python: задачки и вопросы
Развёрнутое пояснение:

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 вложенного генератора можно использовать как итог обработки, например как число загруженных записей, но оно не становится элементом ленивого потока.
2
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Python: задачки и вопросы
Развёрнутое пояснение:

1. В defaults создаётся словарь, где ключ retry ссылается на вложенный словарь со значением limit, равным 3.

2. Метод defaults.copy создаёт новый внешний словарь worker.

3. Вложенный словарь не копируется: значения defaults["retry"] и worker["retry"] ссылаются на один объект.

4. Присваивание через worker меняет limit в этом общем вложенном словаре на 5.

5. Поэтому обращение через defaults видит то же изменение, и print выводит 5.

Почему это важно

Это различие между поверхностным и глубоким копированием. Оно встречается при создании рабочих конфигураций из шаблона: изменение вложенного раздела поверхностной копии может незаметно изменить исходные настройки и повлиять на другие обработчики.
1
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Python: задачки и вопросы
Развёрнутое пояснение:

1. При входе в блок with вызывается метод __enter__, который печатает begin.

2. Тело блока печатает write, после чего возбуждает исключение ValueError.

3. Перед выходом из блока Python вызывает __exit__ и передаёт ему тип, значение и трассировку исключения.

4. __exit__ печатает имя типа исключения — ValueError — и возвращает True.

5. Истинное возвращаемое значение сообщает Python, что исключение обработано, поэтому строка после блока выполняется и печатает continued. Итоговый вывод: begin, write, ValueError и continued на отдельных строках.

Почему это важно

Задача проверяет протокол менеджеров контекста. На практике __exit__ часто освобождает соединения, завершает транзакции и управляет распространением ошибок; случайное возвращение истинного значения может скрыть сбой и позволить программе продолжить работу с некорректным состоянием.
1