ar
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