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

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

Открыть в Telegram

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

Больше
6 903
Подписчики
-224 часа
-217 дней
-4030 дней
Привлечение подписчиков
окт. '26
октябрь '26
+9
в 0 каналах
сентябрь '26
+32
в 0 каналах
Get PRO
август '26
+24
в 0 каналах
Get PRO
июль '26
+28
в 1 каналах
Get PRO
июнь '26
+48
в 0 каналах
Get PRO
май '26
+58
в 1 каналах
Get PRO
апрель '26
+33
в 0 каналах
Get PRO
март '26
+29
в 1 каналах
Get PRO
февраль '26
+32
в 1 каналах
Get PRO
январь '26
+39
в 0 каналах
Get PRO
декабрь '25
+44
в 0 каналах
Get PRO
ноябрь '25
+102
в 3 каналах
Get PRO
октябрь '25
+61
в 0 каналах
Get PRO
сентябрь '25
+56
в 1 каналах
Get PRO
август '25
+65
в 3 каналах
Get PRO
июль '25
+58
в 0 каналах
Get PRO
июнь '25
+56
в 0 каналах
Get PRO
май '25
+52
в 0 каналах
Get PRO
апрель '25
+89
в 0 каналах
Get PRO
март '25
+77
в 1 каналах
Get PRO
февраль '25
+108
в 3 каналах
Get PRO
январь '25
+115
в 2 каналах
Get PRO
декабрь '24
+94
в 1 каналах
Get PRO
ноябрь '24
+81
в 1 каналах
Get PRO
октябрь '24
+78
в 0 каналах
Get PRO
сентябрь '24
+82
в 0 каналах
Get PRO
август '24
+75
в 0 каналах
Get PRO
июль '24
+73
в 0 каналах
Get PRO
июнь '24
+82
в 0 каналах
Get PRO
май '24
+163
в 2 каналах
Get PRO
апрель '24
+158
в 0 каналах
Get PRO
март '24
+117
в 0 каналах
Get PRO
февраль '24
+117
в 0 каналах
Get PRO
январь '24
+143
в 1 каналах
Get PRO
декабрь '23
+140
в 0 каналах
Get PRO
ноябрь '23
+120
в 0 каналах
Get PRO
октябрь '23
+94
в 0 каналах
Get PRO
сентябрь '23
+95
в 0 каналах
Get PRO
август '23
+145
в 0 каналах
Get PRO
июль '23
+312
в 0 каналах
Get PRO
июнь '23
+90
в 0 каналах
Get PRO
май '23
+140
в 0 каналах
Get PRO
апрель '23
+258
в 0 каналах
Get PRO
март '23
+217
в 0 каналах
Get PRO
февраль '23
+307
в 0 каналах
Get PRO
январь '23
+222
в 0 каналах
Get PRO
декабрь '22
+327
в 0 каналах
Get PRO
ноябрь '22
+256
в 0 каналах
Get PRO
октябрь '22
+286
в 0 каналах
Get PRO
сентябрь '22
+294
в 0 каналах
Get PRO
август '22
+652
в 0 каналах
Get PRO
июль '22
+410
в 0 каналах
Get PRO
июнь '22
+246
в 0 каналах
Get PRO
май '22
+360
в 0 каналах
Get PRO
апрель '22
+266
в 0 каналах
Get PRO
март '22
+204
в 0 каналах
Get PRO
февраль '22
+340
в 0 каналах
Get PRO
январь '22
+2 183
в 0 каналах
Get PRO
декабрь '21
+2 522
в 0 каналах
Get PRO
ноябрь '21
+1 808
в 0 каналах
Get PRO
октябрь '21
+1 036
в 0 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
06 октября0
05 октября0
04 октября0
03 октября0
02 октября+1
01 октября+8
Посты канала
Развёрнутое пояснение: 1. Вызов orders() создаёт объект генератора, но его тело пока не выполняется. 2. next(stream) запускает генератор: печатается open, затем выполнение доходит до yield 101 и приостанавливается. 3. Внешний print получает значение 101 и печатает его. 4. Следующий print выводит done, поскольку генератор всё ещё приостановлен на yield. 5. stream.close() передаёт в точку приостановки служебное исключение GeneratorExit. Обычное продолжение после yield не происходит, поэтому строка next не печатается. 6. Перед завершением генератор обязательно выполняет блок finally, который печатает close. Итоговый порядок строк: open, 101, done, close. Почему это важно Задача проверяет жизненный цикл генераторов и гарантированную очистку ресурсов. В потоковой обработке генератор может удерживать файл, соединение или транзакцию; если потребитель прекращает чтение досрочно, явный вызов close() запускает очистку из finally, но не продолжает обычную обработку оставшихся элементов.

2
Нет текста...
200
3
Развёрнутое пояснение: 1. Кортеж regions задаёт два ключа: eu и us. 2. dict.fromkeys(regions, []) создаёт словарь, в котором оба ключа ссылаются на один и тот же пустой список. 3. append изменяет этот общий список, поэтому order-7 становится виден через оба ключа. 4. Выражение queues["us"] + ["order-8"] создаёт новый список, не изменяя исходный. 5. Присваивание связывает ключ us с новым списком, а eu сохраняет ссылку на прежний; поэтому вывод содержит order-7 у eu и оба заказа у us. Почему это важно Задача проверяет понимание общего изменяемого состояния и различия между изменением объекта и заменой ссылки. Такое поведение встречается при создании словарей очередей, групп и накопителей через dict.fromkeys.
236
4
Нет текста...
212
5
Развёрнутое пояснение: 1. defaults содержит исходные значения timeout и retries, а env изначально пуст. 2. ChainMap объединяет отображения для чтения, причём env имеет приоритет перед defaults. 3. Присваивание через config не ищет отображение, где ключ уже существует: значение retries записывается в первое отображение env. 4. Удаление через ChainMap также применяется только к первому отображению. Ключа timeout в env нет, поэтому возникает KeyError, хотя он доступен для чтения из defaults. 5. Обработчик перехватывает KeyError и печатает env с добавленным retries и неизменённый defaults, поэтому вывод равен {'retries': 5} {'timeout': 30, 'retries': 2}. Почему это важно: задача проверяет модель записи и удаления в ChainMap. В многослойных конфигурациях чтение проходит по всем слоям, но изменения не переносятся автоматически в слой, где найдено исходное значение.
236
6
Нет текста...
224
7
Развёрнутое пояснение: 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 может выполнять лишнюю работу даже при наличии ключа. Для ленивого получения запасного значения сначала проверяют наличие ключа или используют другую явную ветвь выполнения.
240
8
Нет текста...
233
9
Развёрнутое пояснение: 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__ либо выбрать другой способ хранения кэша.
299
10
Нет текста...
236
11
Развёрнутое пояснение: 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 применяется для буферов, журналов последних событий и очередей с фиксированной ёмкостью; при переполнении он не создаёт исключение, а незаметно вытесняет старые данные.
234
12
Нет текста...
209
13
Развёрнутое пояснение: 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 при чтении отсутствующих ключей. В счётчиках метрик простая проверка значения может незаметно изменить словарь, создать лишние записи и повлиять на последующую сериализацию или обход данных.
247
14
Нет текста...
241
15
Развёрнутое пояснение: 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 применяется для хранения идентификаторов запросов, данных трассировки и другого состояния асинхронной операции. Контекст задачи фиксируется при её создании, поэтому изменение переменной перед фактическим запуском задачи не обновляет уже скопированный контекст.
228
16
Нет текста...
240
17
Развёрнутое пояснение: 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(), чтобы вся цепочка выполнилась.
233
18
Нет текста...
262
19
Развёрнутое пояснение: 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 запускает конкурентную задачу при ближайшей передаче управления циклу событий. Ожидание одной задачи не мешает другим уже запланированным задачам начать работу, что важно учитывать при отправке данных, обновлении метрик и обработке очередей.
238
20
Нет текста...
257