Python: задачки и вопросы
الذهاب إلى القناة على Telegram
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media
إظهار المزيد6 903
المشتركون
-224 ساعات
-217 أيام
-4030 أيام
جاري تحميل البيانات...
القنوات المماثلة
سحابة العلامات
الإشارات الواردة والصادرة
---
---
---
---
---
---
جذب المشتركين
أكتوبر '26أكتوبر '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 |
