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

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

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

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

نمایش بیشتر
6 963
مشترکین
+124 ساعت
-67 روز
-6130 روز
جذب مشترکین
اوت '26
اوت '26
+21
در 0 کانال‌ها
ژوئیه '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 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
27 اوت0
26 اوت+2
25 اوت0
24 اوت+1
23 اوت+1
22 اوت+1
21 اوت+2
20 اوت+1
19 اوت0
18 اوت+2
17 اوت0
16 اوت+2
15 اوت0
14 اوت+1
13 اوت0
12 اوت+1
11 اوت+1
10 اوت+1
09 اوت0
08 اوت0
07 اوت0
06 اوت+2
05 اوت+1
04 اوت0
03 اوت+1
02 اوت0
01 اوت+1
پست‌های کانال
Как понять, что программисту пора в отпуск: — на столе бардак; — шорты не доставались с позапрошлого лета; — чудится тифлинг;
Как понять, что программисту пора в отпуск: — на столе бардак; — шорты не доставались с позапрошлого лета; — чудится тифлинг; — на вопрос «когда отдыхаешь?» отвечает «после релиза»; — релиз был в феврале. Сам он с места не сдвинется. Помогите Типичному Программисту собраться и улететь в отпуск в новой мини-игре!

2
Развёрнутое пояснение: 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, иначе двоичные погрешности сохраняются в «точном» рациональном типе.
347
3
بدون متن...
277
4
Развёрнутое пояснение: 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().
310
5
بدون متن...
247
6
Развёрнутое пояснение: 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.
268
7
بدون متن...
250
8
⚡️ О!Хакатон возвращается — на кону миллион Приглашаем Go- и Python-разработчиков, аналитиков и продакт-менеджеров на тревел-
⚡️ О!Хакатон возвращается — на кону миллион Приглашаем Go- и Python-разработчиков, аналитиков и продакт-менеджеров на тревел-тех хакатон от Островка. Вам предстоит решить одну из двух AI-задач в сфере тревел-теха и побороться за главный приз — 1 000 000 ₽. Присоединиться к хакатону можно из любой точки мира. Участвуйте командой до пяти человек и выбирайте один из двух треков: ➡️ «О!дин запрос». Цель для junior-специалистов — создать AI-агента для путешествий и отелей. ➡️ «О!дин шаг до идеального отеля». Задача для специалистов уровней middle и senior — «переизобрести» опыт бронирования пользователя с помощью AI и новых интерфейсных механик. 📎 Регистрация открыта до 16 октября 2026 года. Стартуем 23 октября. Скорее присоединяйтесь по ссылке!
295
9
⚡️ О!Хакатон возвращается — на кону миллион Приглашаем Go- и Python-разработчиков, аналитиков и продакт-менеджеров на тревел-
⚡️ О!Хакатон возвращается — на кону миллион Приглашаем Go- и Python-разработчиков, аналитиков и продакт-менеджеров на тревел-тех хакатон от Островка. Вам предстоит решить одну из двух AI-задач в сфере тревел-теха и побороться за главный приз — 1 000 000 ₽. Присоединиться к хакатону можно из любой точки мира. Участвуйте командой до пяти человек и выбирайте один из двух треков: ➡️ «О!дин запрос». Цель для junior-специалистов — создать AI-агента для путешествий и отелей. ➡️ «О!дин шаг до идеального отеля». Задача для специалистов уровней middle и senior — «переизобрести» опыт бронирования пользователя с помощью AI и новых интерфейсных механик. 📎 Регистрация открыта до 16 октября 2026 года. Стартуем 23 октября. Скорее присоединяйтесь по ссылке!
1
10
Развёрнутое пояснение: 1. Список logs содержит четыре кортежа: две записи api и две db, чередующиеся. 2. itertools.groupby не сортирует данные и не ищет все одинаковые ключи во всём списке: он формирует новую группу каждый раз, когда ключ очередного элемента отличается от ключа предыдущего. 3. Последовательность ключей в logs: api, db, api, db. Поэтому группы получаются такими: api с одной записью, db с одной записью, снова api с одной записью и снова db с одной записью. 4. В dict comprehension каждый ключ перезаписывается при повторном вхождении. Сначала 'api' получает список из одной ошибки, потом 'db' — один успех, затем 'api' зативается второй группой из одной успешной записи, и в конце 'db' перезаписывается группой с одной ошибкой. 5. В итоге groups['api'] — это список из одного кортежа [('api', 'ok')], а len от него равен 1. Почему это важно: в аналитике логов и отчётах часто ожидают, что groupby сгруппирует все записи по ключу, как SQL GROUP BY, но в Python он работает только над отсортированными или уже упорядоченными данными. Если пропустить сортировку, группы дробятся, а при записи в словарь последняя группа затирает предыдущие с тем же ключом. Это приводит к тихой потере данных и неверным агрегатам.
309
11
بدون متن...
277
12
Развёрнутое пояснение: 1. Создаётся словарь tags с ключами api и db. 2. Запускается цикл for key in tags, который получает итератор ключей словаря. 3. Итератор запоминает ожидаемое количество элементов на момент начала обхода. 4. При первом же ключе api условие срабатывает и вызывается tags.pop(key), удаляя элемент из словаря. 5. Словарь изменил размер во время итерации, поэтому при следующей попытке получить следующий ключ интерпретатор обнаруживает рассогласование и возбуждает RuntimeError: dictionary changed size during iteration. 6. print(tags) не выполняется, потому что исключение прерывает выполнение. Почему это важно: такая ошибка часто возникает при фильтрации или очистке словарей состояния, кэша или метрик. Правильный способ — собрать ключи для удаления в отдельный список и удалять после цикла, либо создавать новый словарь через dict comprehension. Это позволяет избежать неожиданного падения на проде при обработке логов, конфигов или счётчиков.
321
13
بدون متن...
279
14
Развёрнутое пояснение: 1. Создаётся пустой список queue. 2. defaultdict инициализируется фабрикой lambda: queue, которая при каждом обращении по отсутствующему ключу возвращает ссылку на этот же список. 3. tasks['api'] вызывает фабрику, возвращает queue и добавляет в него строку retry. 4. tasks['queue'] снова вызывает фабрику и возвращает тот же список queue, который уже содержит retry. 5. Поэтому print выводит ['retry']. Почему это важно: такая ошибка возникает, когда разработчик хочет инициализировать значение изменяемым объектом и вместо конструктора list передаёт lambda, замкнутую на заранее созданный объект. В планировщиках задач, группировке событий по категориям или кэшировании результатов по ключам это приводит к тому, что разные ключи делят одно состояние. Правильный способ — передать list или функцию, создающую новый объект при каждом вызове, например defaultdict(list).
327
15
بدون متن...
327
16
Развёрнутое пояснение: 1. State — перечисление, член State.OK имеет значение ok, но сам является отдельным объектом Enum. 2. Функция check сравнивает строку ok с объектом State.OK оператором равенства. 3. У Enum операция равенства считает равными только члены одного и того же перечисления, поэтому сравнение со строкой возвращает False. 4. В результате print выводит False. Почему это важно: при рефакторинге строковых констант в Enum часто забывают, что сравнение со строкой из JSON или БД перестаёт работать. Правильно сравнивать через State(raw) == State.OK или raw == State.OK.value. Это типичная ошибка в валидации API и конфигурации.
335
17
بدون متن...
291
18
Развёрнутое пояснение: 1. При первом обращении c.ports вызывается метод ports и возвращается список [80]. 2. cached_property записывает этот объект в c.__dict__ под именем ports. 3. Вызов c.ports.append(443) изменяет именно тот список, который теперь лежит в кэше. 4. При повторном обращении c.ports cached_property находит ports в __dict__ и возвращает сохранённый объект [80, 443]. 5. print выводит [80, 443]. Почему это важно: cached_property удобен для дорогих вычислений, но кэшированный объект остаётся общим для всех последующих обращений. Если метод возвращает изменяемую коллекцию и кто-то её мутирует, изменения застревают в кэше. В конфигах и синглтонах это приводит к «засорению» настроек между тестами или запросами: безопаснее возвращать неизменяемые копии или отделять изменяемое состояние от кэшированного свойства.
481
19
بدون متن...
350
20
Развёрнутое пояснение: 1. MRO класса D(B, C): D, B, C, A. 2. D().f() печатает D и через super().f() делегирует следующему классу в MRO — B. 3. B.f печатает B и через super().f() делегирует следующему — C, а не A, потому что super() опирается на линейный MRO объекта, а не на прямого родителя. 4. C.f печатает C и через super().f() делегирует A. 5. A.f печатает A. 6. Итоговый вывод: DBCA. Почему это важно: понимание MRO и super() нужно при проектировании миксинов и множественного наследования, иначе можно случайно пропустить ветку или вызвать метод дважды.
390