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

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

رفتن به کانال در Telegram

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

نمایش بیشتر
6 901
مشترکین
-224 ساعت
-217 روز
-4030 روز

در حال بارگیری داده...

جذب مشترکین
اکتبر '26
اکتبر '26
+10
در 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 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
07 اکتبر+1
06 اکتبر0
05 اکتبر0
04 اکتبر0
03 اکتبر0
02 اکتبر+1
01 اکتبر+8
پست‌های کانال
Разбор задачи 1️⃣Строковая переменная name содержит значение report.txt. 2️⃣Метод strip принимает множество символов: переданный аргумент .txt воспринимается как набор из точки, t и x. 3️⃣Интерпретатор удаляет символы из этого набора с обоих концов строки, пока не встретит первый символ, отсутствующий в наборе. 4️⃣Слева буква r не входит в набор, а справа удаляются расширение .txt и последняя буква t из слова report, после чего процесс останавливается на букве r. 5️⃣На экран выводится строка repor. Почему это важно Чтобы отрезать расширение, используйте name.removesuffix(".txt") (есть с Python 3.9) или pathlib.Path(name).stem. strip, lstrip и rstrip для этого не годятся: они портят имя каждый раз, когда его крайние буквы совпадают с символами расширения.

2
بدون متن...
187
3
Развёрнутое пояснение: 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, но не продолжает обычную обработку оставшихся элементов.
323
4
بدون متن...
258
5
Развёрнутое пояснение: 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.
275
6
بدون متن...
227
7
Развёрнутое пояснение: 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. В многослойных конфигурациях чтение проходит по всем слоям, но изменения не переносятся автоматически в слой, где найдено исходное значение.
247
8
بدون متن...
236
9
Развёрнутое пояснение: 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 может выполнять лишнюю работу даже при наличии ключа. Для ленивого получения запасного значения сначала проверяют наличие ключа или используют другую явную ветвь выполнения.
252
10
بدون متن...
240
11
Развёрнутое пояснение: 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__ либо выбрать другой способ хранения кэша.
303
12
بدون متن...
241
13
Развёрнутое пояснение: 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 применяется для буферов, журналов последних событий и очередей с фиксированной ёмкостью; при переполнении он не создаёт исключение, а незаметно вытесняет старые данные.
256
14
بدون متن...
251
15
Развёрнутое пояснение: 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 при чтении отсутствующих ключей. В счётчиках метрик простая проверка значения может незаметно изменить словарь, создать лишние записи и повлиять на последующую сериализацию или обход данных.
252
16
بدون متن...
254
17
Развёрнутое пояснение: 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 применяется для хранения идентификаторов запросов, данных трассировки и другого состояния асинхронной операции. Контекст задачи фиксируется при её создании, поэтому изменение переменной перед фактическим запуском задачи не обновляет уже скопированный контекст.
234
18
بدون متن...
247
19
Развёрнутое пояснение: 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(), чтобы вся цепочка выполнилась.
239
20
بدون متن...
267