Python: задачки и вопросы
Відкрити в Telegram
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media
Показати більше6 964
Підписники
Немає даних24 години
-167 днів
-6430 день
Триває завантаження даних...
Схожі канали
Хмара тегів
Вхідні та вихідні згадування
---
---
---
---
---
---
Залучення підписників
серпень '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 каналах
| Дата | Залучення підписників | Згадування | Канали | |
| 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, иначе двоичные погрешности сохраняются в «точном» рациональном типе. | 335 |
| 3 | Немає тексту... | 269 |
| 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(). | 309 |
| 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. | 267 |
| 7 | Немає тексту... | 250 |
| 8 | ⚡️ О!Хакатон возвращается — на кону миллион
Приглашаем Go- и Python-разработчиков, аналитиков и продакт-менеджеров на тревел-тех хакатон от Островка.
Вам предстоит решить одну из двух AI-задач в сфере тревел-теха и побороться за главный приз — 1 000 000 ₽.
Присоединиться к хакатону можно из любой точки мира. Участвуйте командой до пяти человек и выбирайте один из двух треков:
➡️ «О!дин запрос». Цель для junior-специалистов — создать AI-агента для путешествий и отелей.
➡️ «О!дин шаг до идеального отеля». Задача для специалистов уровней middle и senior — «переизобрести» опыт бронирования пользователя с помощью AI и новых интерфейсных механик.
📎 Регистрация открыта до 16 октября 2026 года. Стартуем 23 октября.
Скорее присоединяйтесь по ссылке! | 295 |
| 9 | ⚡️ О!Хакатон возвращается — на кону миллион
Приглашаем 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 он работает только над отсортированными или уже упорядоченными данными. Если пропустить сортировку, группы дробятся, а при записи в словарь последняя группа затирает предыдущие с тем же ключом. Это приводит к тихой потере данных и неверным агрегатам. | 303 |
| 11 | Немає тексту... | 274 |
| 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. Это позволяет избежать неожиданного падения на проде при обработке логов, конфигов или счётчиков. | 315 |
| 13 | Немає тексту... | 276 |
| 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 | Немає тексту... | 325 |
| 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 и конфигурации. | 334 |
| 17 | Немає тексту... | 290 |
| 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 |
