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

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

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

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

نمایش بیشتر
6 936
مشترکین
-124 ساعت
-17 روز
-4530 روز
جذب مشترکین
سپتامبر '26
سپتامبر '26
+13
در 0 کانال‌ها
اوت '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 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
16 سپتامبر0
15 سپتامبر0
14 سپتامبر0
13 سپتامبر0
12 سپتامبر+3
11 سپتامبر+5
10 سپتامبر0
09 سپتامبر+2
08 سپتامبر0
07 سپتامبر0
06 سپتامبر0
05 سپتامبر0
04 سپتامبر+2
03 سپتامبر+1
02 سپتامبر0
01 سپتامبر0
پست‌های کانال
А вы уже забрали свой подарок ко Дню программиста? Мы в Tproger вместе с нашими друзьями собрали целую коробку подарков к ваш
А вы уже забрали свой подарок ко Дню программиста? Мы в Tproger вместе с нашими друзьями собрали целую коробку подарков к вашему профессиональному празднику. Переходите по ссылке, трясите коробку и забирайте свой презент: https://tprg.ru/pLwZ

2
Развёрнутое пояснение: 1. Создаётся список batch с двумя разными словарями. 2. Вызов enrich(batch) возвращает генератор, тело которого пока не выполняется. 3. next(stream) запускает цикл, обрабатывает первый словарь, добавляет в него ключ status и приостанавливается на yield. Первый словарь уже изменён. 4. list(stream) возобновляет генератор, дообрабатывает второй словарь, добавляет тот же ключ и завершает итерацию. 5. print(batch) выводит исходный список, в котором теперь оба словаря содержат status со значением ok. Почему это важно: ленивые пайплайны часто используются для обработки больших потоков данных, и мутация исходных объектов внутри генератора — распространённая ошибка. Если потребитель прочитает только часть потока или если несколько задач делят один источник, состояние исходных записей окажется непредсказуемым. Безопаснее возвращать копии или использовать неизменяемые структуры данных.
465
3
بدون متن...
331
4
Развёрнутое пояснение: 1. Создаётся внутренний список ['', '', ''] — три пустые строки. 2. Выражение [внутренний_список] * 3 создаёт новый список из трёх элементов, но каждый элемент — это ссылка на один и тот же внутренний список, а не его независимая копия. 3. Присваивание grid[0][0] = 'X' изменяет первый элемент этого общего внутреннего списка, поэтому все три строки grid отображают одно и то же изменение. 4. print(grid) выводит [['X', '', ''], ['X', '', ''], ['X', '', '']]. Почему это важно: такая инициализация часто встречается при создании матриц, игровых полей, таблиц или двумерных кэшей. Если строки оказываются общим изменяемым объектом, мутация одной ячейки неожиданно распространяется на весь столбец или всю таблицу, что приводит к трудноуловимым багам. Правильный способ — создавать каждую строку отдельно, например, через списочное включение [['' for _ in range(3)] for _ in range(3)].
308
5
بدون متن...
243
6
Развёрнутое пояснение: 1. Декоратор dataclass(frozen=True) генерирует для Client методы __init__, __repr__, __eq__ и __hash__. 2. __eq__ у frozen dataclass сравнивает все поля экземпляров. У a name='a', у b name='b', поэтому a!= b. 3. __hash__ тоже строится по всем полям, поэтому hash(a)!= hash(b). 4. Словарь cache размещает a и b в разные корзины. После cache[a] = 'old' и cache[b] = 'new' в словаре два элемента. 5. Обращение cache[a] возвращает значение, связанное с a, то есть 'old'. Итоговый вывод: old 2. Почему это важно: dataclass часто используют как ключи dict или элементы set, и поведение зависит от того, какие поля входят в равенство. frozen=True решает проблему изменяемости, но не помогает, если логика идентичности подразумевает только часть полей. В реальном коде это приводит к дублям в кеше, утечке памяти и неверным попаданиям при поиске.
265
7
بدون متن...
242
8
Развёрнутое пояснение: 1. Создаётся список services = ['api', 'auth', 'db']. 2. Вызов dict.fromkeys(services, []) создаёт словарь, где каждому ключу присвоена ссылка на один и тот же пустой список, а не три независимых списка. 3. Выражение statuses['api'] возвращает этот общий список, а append('ok') изменяет его, добавляя строку 'ok'. 4. Поскольку все три ключа ссылаются на один изменённый объект, print выводит {'api': ['ok'], 'auth': ['ok'], 'db': ['ok']}. Почему это важно: это классическая ловушка при инициализации словарей с изменяемыми значениями по умолчанию в конфигах, группировках или агрегации статусов. Вместо dict.fromkeys(..., []) используйте dict comprehension или defaultdict(list), чтобы каждый ключ получил свой независимый объект и неожиданные мутации не распространялись на соседние записи.
255
9
بدون متن...
232
10
Развёрнутое пояснение: 1. При определении функции log_event создаётся один пустой список buffer, который используется как значение по умолчанию. 2. Первый вызов log_event со строкой timeout добавляет эту строку в общий список и возвращает его, результат сохраняется в переменную a. 3. Второй вызов log_event со строкой 403 использует тот же список buffer, добавляет строку 403 и возвращает его, результат сохраняется в переменную b. 4. Переменные a и b указывают на один и тот же объект, поэтому print(a, b) выводит ['timeout', '403'] ['timeout', '403']. Почему это важно: изменяемый аргумент по умолчанию часто встречается в функциях-логгерах, кэширующих обёртках и накопителях метрик, но на деле он работает как глобальное состояние между вызовами. В многопоточном коде это создаёт состояние гонки, а в тестах — нестабильные результаты. Правильный паттерн: buffer=None и создание нового списка внутри функции.
275
11
بدون متن...
254
12
Развёрнутое пояснение: 1. Внутри report создаётся объект map, который при обходе вычисляет len для каждой строки. 2. sum(sizes) проходит по всем элементам: 3 + 4 + 2 = 9. После этого итератор исчерпан. 3. list(sizes) пытается снова обойти тот же объект map, но элементов больше нет, поэтому valid = 0. 4. Функция возвращает кортеж (9, 0), который и печатается. Почему это важно: в пайплайнах обработки логов или событий часто передают map, filter или генераторное выражение сразу в несколько агрегирующих функций, ожидая, что каждая из них прочитает данные заново. Из-за одноразовости итераторов это приводит к заниженным счётчикам, потере записей и нестабильным отчётам, пока данные не материализовать в список.
282
13
بدون متن...
322
14
Как понять, что программисту пора в отпуск: — на столе бардак; — шорты не доставались с позапрошлого лета; — чудится тифлинг;
Как понять, что программисту пора в отпуск: — на столе бардак; — шорты не доставались с позапрошлого лета; — чудится тифлинг; — на вопрос «когда отдыхаешь?» отвечает «после релиза»; — релиз был в феврале. Сам он с места не сдвинется. Помогите Типичному Программисту собраться и улететь в отпуск в новой мини-игре!
358
15
Развёрнутое пояснение: 1. from fractions import Fraction импортирует рациональное число. 2. Fraction(0.1) берёт не 1/10, а точное значение float 0.1 — дробь с большим знаменателем. 3. То же происходит с Fraction(0.2) и Fraction(0.3). 4. a + b вычисляет сумму двух таких двоичных дробей. 5. Эта сумма не равна дроби, полученной из float 0.3, потому что 0.1 + 0.2 ≠ 0.3 в двоичной плавающей арифметике. 6. Сравнение возвращает False. Почему это важно: при финансовых расчётах и точных вычислениях Fraction следует создавать из строк или целых чисел, а не из float, иначе двоичные погрешности сохраняются в «точном» рациональном типе.
466
16
بدون متن...
361
17
Развёрнутое пояснение: 1. При определении функции ingest создаётся один объект множества set() и сохраняется как значение по умолчанию для параметра seen. 2. Первый вызов ingest(['a','b']) использует это же множество, добавляет в него 'a' и 'b' и возвращает len(seen), то есть 2. 3. Второй вызов ingest(['b','c']) получает уже непустое множество с элементами 'a' и 'b'. Добавляется только 'c', поэтому длина становится 3. 4. Переменная res получает кортеж (2, 3), а print(*res) выводит 2 3. 5. Правильный вариант — 2 3. Почему это важно: изменяемое значение по умолчанию — частая ловушка при реализации кэшей, дедупликаторов, счётчиков и накопителей ошибок. В тесте, где функцию вызывают один раз, баг может не проявиться, а в проде при повторных вызовах общее изменяемое состояние искажает результат. Чтобы избежать этого, изменяемый объект создают внутри тела функции: seen=None, а внутри if seen is None: seen=set().
397
18
بدون متن...
288
19
Развёрнутое пояснение: 1. В памяти создаётся объект Tags, содержащий два ключа a и b. 2. Функция json.dumps начинает кодирование этого объекта. 3. Внутренний энкодер CPython сначала проверяет базовые типы: строки, числа, булевы значения, None, списки, кортежи и dict. 4. Tags наследует UserDict, который не является подклассом dict, поэтому объект не попадает в ветку для словарей. 5. Поскольку тип неизвестен энкодеру, вызывается функция default, переданная в аргументе default. 6. В default объект o имеет длину 2, поэтому возвращается строка tags:2. 7. json.dumps кодирует эту строку как JSON-строку, а print выводит tags:2. Почему это важно: при сериализации пользовательских маппингов, таких как UserDict или ChainMap, нельзя рассчитывать, что json.dumps автоматически превратит их в обычный словарь. Это часто встречается при логировании, отправке конфигурации или сохранении состояния, когда кастомный контейнер оказывается строкой вместо JSON-объекта. Чтобы избежать сюрприза, передавайте данные через dict() или реализуйте собственный JSONEncoder.
342
20
بدون متن...
301