uk
Feedback

Не попадись на ботовода! Telemetrio знаходить і позначає такі канали мітками 👉 Хочеш бачити мітку, оформляй підписку

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

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

Відкрити в Telegram

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

Показати більше
6 830
Підписники
-224 години
-157 днів
-6430 днів

Завантажуємо дані

Залучення підписників
лист '26
листопад '26
+4
в 0 каналах
жовтень '26
+48
в 0 каналах
Get PRO
вересень '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 каналах
Дата
Залучення підписників
Згадування
Канали
15 листопада0
14 листопада+1
13 листопада0
12 листопада0
11 листопада0
10 листопада0
09 листопада0
08 листопада0
07 листопада0
06 листопада0
05 листопада0
04 листопада+1
03 листопада0
02 листопада0
01 листопада+2
Дописи каналу
Где остановился ZstdDecompressor 1. Каждый вызов zstd.compress создаёт отдельный кадр Zstandard. Первый содержит байты api:, второй — ready. Операция first + second соединяет сжатые кадры в одном буфере, не распаковывая их. 2. Модульная функция zstd.decompress умеет читать несколько соединённых кадров. Она распаковывает оба и возвращает b'api:ready'. Именно это значение выводит первый print. 3. Метод decompress объекта ZstdDecompressor обрабатывает один кадр. Поэтому второй print выводит b'api:'. Байты второго кадра остаются в reader.unused_data. Остаток непустой, поэтому bool(reader.unused_data) возвращает True. Это значение выводит третий print. Почему это важно При чтении составного потока нельзя считать первый успешный вызов объектного декодера концом всех данных. Для такого буфера подходит модульная decompress. Если работаете с объектным декодером, учитывайте unused_data и передавайте следующий кадр новому объекту. Уже завершивший кадр декодер для следующего не переиспользуют. Код проверен в CPython 3.14.4. Модуль compression.zstd необязателен и может отсутствовать в другой сборке Python. Документация Python

2
Немає тексту...
143
3
Откуда взялись два True 1. Во временном каталоге создаётся единственный обычный файл item. Затем iterdir возвращает объект Path для этой записи. Первый item.info.is_file() даёт True. Сведения о типе сохраняются в Path.info. 2. unlink удаляет файл, а mkdir создаёт каталог по тому же пути. Объект item при этом остаётся прежним. Изменение файловой системы не сбрасывает сохранённые в нём сведения. 3. Повторный item.info.is_file() использует кэш и снова возвращает True. Но item.is_dir() выполняет свежую проверку и видит каталог. Поэтому вывод состоит из двух строк: True и True True. В последней строке первый True взят из кэша, а второй получен при свежей проверке. Почему это важно Path.info удобен для обхода дерева, когда подходят уже полученные сведения. Если важен текущий тип записи, используйте Path.is_file() или Path.is_dir(). У Path.info нет метода сброса кэша. Новый Path(item) создаёт объект с пустым кэшем. При этом свежая проверка сама по себе не защищает от изменений между проверкой и дальнейшим действием. Код проверен в CPython 3.14.4. Документация Python
188
4
Немає тексту...
187
5
Почему request_id снова равен none 1. У request_id задано значение по умолчанию — строка none. В текущем контексте переменную ещё не устанавливали, поэтому первый get возвращает именно эту строку. Она отличается от специального значения None. 2. Вызов set устанавливает req-7 и возвращает Token, который позволяет отменить это изменение. Начиная с Python 3.14 Token поддерживает контекстный менеджер. Поэтому выражение with request_id.set(...) корректно, а внутри блока get возвращает req-7. 3. При выходе из with токен восстанавливает состояние до set. Здесь явно установленного значения раньше не было. Последний get снова обращается к значению по умолчанию и выводит none. Полный вывод: none, req-7, none, каждое значение на своей строке. Почему это важно Так можно ограничить идентификатор запроса одной операцией, не оставляя его для последующих вызовов в том же контексте. Это короткая запись привычного set с последующим reset в finally. Токен относится к конкретному изменению, повторно сбрасывать переменную тем же токеном нельзя. Код проверен в CPython 3.14.4. Документация Python
219
6
Немає тексту...
210
7
Как ForwardRef находит поздний тип 1. В Python 3.14 аннотации по умолчанию вычисляются отложенно. Поэтому функция dispatch объявляется, хотя имя Payload ещё не определено. Импорта future в этом примере нет. 2. get_annotations вызывается до объявления класса. Режим FORWARDREF позволяет вернуть объект ForwardRef для неизвестного имени вместо ошибки при попытке получить его значение. Здесь ref хранит ссылку на Payload. Первый print выводит ForwardRef Payload. 3. Затем выполняется объявление class Payload, и имя появляется в глобальном пространстве модуля. Вызов ref.evaluate() разрешает сохранённую ссылку с учётом этого пространства. Получается тот же объект класса, поэтому проверка is Payload выводит True. Почему это важно Реестр плагинов может прочитать аннотации до загрузки всех типов и разрешить недостающие ссылки позже. Важно выбрать подходящий момент: FORWARDREF не создаёт отсутствующий класс. Здесь проверено простое глобальное имя. Чтение и вычисление аннотаций может выполнять код, поэтому этот приём не делает чужие аннотации безопасными. Код проверен в CPython 3.14.4. Документация Python
249
8
Немає тексту...
228
9
Когда применяется формат 04d 1. t-строка в Python 3.14 создаёт объект Template. Выражение limit вычисляется при создании шаблона, поэтому первая интерполяция хранит целое число 7. 2. Спецификация 04d сохраняется отдельно в format_spec. Она ещё не превращает значение в строку 0007. Поэтому первый print выводит 7 04d: исходное число и спецификацию через пробел. 3. Дальше код сам собирает результат. template.strings[0] содержит «limit=», а strings[1] — пустую строку после интерполяции. Между ними добавляется результат format(7, "04d"). Он равен строке 0007, так что второй print выводит limit=0007. Почему это важно Обработчик t-строки получает и значение с его типом, и указания по форматированию. Именно обработчик решает, применять ли format и как собирать результат. Здесь показан один подставляемый фрагмент, это не универсальный рендерер шаблонов. Для обычной готовой строки с таким форматированием достаточно f-строки. Код проверен в CPython 3.14.4. Документация Python
238
10
Немає тексту...
219
11
Как asyncio.run выполняет ReadyJob 1. У экземпляра ReadyJob есть метод __await__. При его вызове создаётся корутина finish и возвращается её итератор. Так объект поддерживает протокол awaitable: его можно ожидать через await. 2. В Python 3.14 asyncio.run принимает любой awaitable. Поэтому ему подходит и ReadyJob, хотя сам объект не создан вызовом async def. 3. finish возвращает строку index-ready. Она становится результатом ожидания, затем результатом asyncio.run. Внешний print выводит index-ready без кавычек. Объект корутины в вывод не попадает. Почему это важно Если библиотека возвращает собственный awaitable, в Python 3.14 его можно передать напрямую в точку входа. Не нужно добавлять корутину-обёртку только ради типа аргумента. Но asyncio.run нельзя вызвать, если в том же потоке уже работает цикл событий. В асинхронном обработчике такой объект обычно ожидают через await. Код проверен в CPython 3.14.4. Документация Python
266
12
Немає тексту...
246
13
Почему slug пересчитывается 1. Job("Night Build") вызывает сгенерированный __init__, затем __post_init__. В первый раз slug становится "night-build". Следующая строка вручную заменяет его на "manual". 2. replace(old, name="Quick Fix") создаёт новый Job через __init__. Поле slug помечено init=False и из old не копируется. 3. У нового объекта снова вызывается __post_init__. Именно наш метод вычисляет slug из нового name и получает "quick-fix". Исходный объект не меняется. Вывод — manual quick-fix. Вариант manual manual предполагал бы копирование slug. Вариант night-build quick-fix не учитывает ручное изменение old.slug. ValueError возник бы при попытке передать slug в changes, например dc.replace(old, slug="forced"), но здесь меняется допустимое поле name. Для вычисляемых полей учитывайте повторный вызов __post_init__ при replace. Само init=False не задаёт формулу пересчёта. В этой задаче она явно написана в методе, а ручная правка вычисляемого поля не переносится в новый объект. Документация Python
295
14
Немає тексту...
296
15
Отмена внутри, TimeoutError снаружи 1. asyncio.timeout(0) назначает отмену на ближайшую итерацию цикла событий. Event создан без установленного флага, и никто не вызовет set(). Поэтому wait() приостанавливает текущую задачу. 2. Тайм-аут отменяет эту задачу. В точке await возникает asyncio.CancelledError. Внутренний except TimeoutError его не перехватывает, строка inside не печатается. 3. При выходе из async with менеджер timeout преобразует свою отмену в TimeoutError. Внешний обработчик печатает outside. Затем выполнение продолжается и печатает done. Правильный вариант: outside | done. Вариант inside | done предполагает, что TimeoutError попадёт во внутренний обработчик ещё до преобразования отмены в это исключение. Обе метки одновременно тоже не печатаются. Только done потребовало бы завершения ожидания без тайм-аута, а событие никто не устанавливает. Обработчик TimeoutError размещайте снаружи нужного timeout-контекста. Не поглощайте CancelledError внутри операции: механизм тайм-аута использует отмену. В этом примере нет задержки sleep и зависимости от скорости компьютера. Документация Python
286
16
Немає тексту...
286
17
Где заканчивается компонент пути 1. Здесь явно импортирован posixpath, поэтому обе строки разбираются по правилам POSIX независимо от ОС запуска. 2. commonprefix() сравнивает строки посимвольно. Вторая строка начинается с первой целиком, поэтому результат — /srv/config. 3. commonpath() сравнивает компоненты. После общего /srv идут разные имена: config и config-old. Общий путь — /srv. Правильный вариант: /srv/config | /srv. Два /srv означали бы сравнение компонентов в обоих вызовах. Два /srv/config — посимвольное сравнение в обоих. ValueError здесь нет: список непустой, оба пути абсолютные. Строковый префикс не доказывает, что файл находится внутри каталога: имя config-old тоже начинается с config. commonpath учитывает границы компонентов и различает эти имена. Это лексическая операция, она не разрешает символические ссылки и сама по себе не решает гонки при доступе к файловой системе. Документация Python
278
18
Немає тексту...
285
19
Аргументы до и после apply_defaults() 1. bind("eu") сопоставляет строку "eu" параметру region. Функция fetch при этом не выполняется. Объект BoundArguments описывает вызов. 2. В arguments сначала попадают только явно связанные аргументы. Поэтому первый print выводит {'region': 'eu'}. Значение timeout=5 пока пропущено. 3. apply_defaults() добавляет недостающие значения по умолчанию. Для timeout это 5, для **options — пустой словарь. Второй print выводит {'region': 'eu', 'timeout': 5, 'options': {}}. Верный ответ — первый вариант. Во втором потерян пустой словарь options. Третий игнорирует apply_defaults(). TypeError не возникает: обязательный region передан, timeout имеет значение по умолчанию, а **options может быть пустым. Различие полезно в декораторах и логировании. До apply_defaults() видно, что передал вызывающий код. После него можно обрабатывать все аргументы вызова, включая значения по умолчанию. Явно переданные значения при этом сохраняются. Документация Python
302
20
Немає тексту...
292