Python: задачки и вопросы
Open in Telegram
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media
Show more6 963
Subscribers
+124 hours
-67 days
-6130 days
Posts Archive
Подробное объяснение
1️⃣ hash(1) == hash(1.0) == hash(True) == 1.
2️⃣ 1 == 1.0 == True → все дубликаты в set → len → 1.
3️⃣ a is b → 1 is 1.0 → разные типы, разные объекты → False.
4️⃣ a is c → 1 is True → False.
5️⃣ Вывод: 1 False False.
Почему это важно
is для чисел — антипаттерн. Работает случайно для малых чисел, ломается в production. Всегда используйте ==.
Подробное объяснение
1️⃣ a = Singleton(): _inst равен None → создаётся объект → _inst заполнен.
2️⃣ b = Sub(): Sub не переопределяет __new__, использует родительский.
3️⃣ Внутри __new__ проверяется cls._inst. Python ищет _inst в MRO: Sub.__dict__ → Singleton.__dict__.
4️⃣ Находит _inst в Singleton (уже не None) → возвращает тот же объект.
5️⃣ a is b → True. Тип объекта — Singleton (создан через super().__new__(cls) в первый раз).
6️⃣ Вывод: True Singleton Singleton.
Почему это важно?
Наследование ломает изоляцию Singleton. Каждый подкласс должен иметь свой _inst, иначе все клонируют объект родителя.
Подробное объяснение
1️⃣ Выражение [0] * 3 создаёт список [0, 0, 0] — один объект в памяти.
2️⃣ Выражение [[0, 0, 0]] * 3 создаёт три ссылки на этот же объект, а не три независимых списка.
3️⃣ Переменная m содержит [[0,0,0] ref, [0,0,0] ref, [0,0,0] ref]. Все ref → один объект.
4️⃣ m[0][0] = 1 обращается к первой ссылке, находит тот же список и меняет его первый элемент.
5️⃣ Поскольку все три строки ссылаются на один список, изменение видно во всех строках.
6️⃣ Вывод: [[1, 0, 0], [1, 0, 0], [1, 0, 0]].
Почему это важно:
Классический баг при создании игровых полей, таблиц и матриц. Чтобы сделать независимые строки, используйте list comprehension: [[0]*3 for _ in range(3)] — тогда каждая строка будет своим объектом.
Подробное объяснение:
1️⃣ Цикл for i in range(3) запускается: i принимает значения 0, 1, 2.
2️⃣ На итерации i = 0 условие if i == 1 ложно — цикл продолжается.
3️⃣ На итерации i = 1 условие истинно — выполняется break.
4️⃣ break немедленно прерывает цикл.
5️⃣ Блок else цикла проверяется только при нормальном завершении (без break).
6️⃣ Поскольку был break, блок else пропускается.
7️⃣ Выполняется print("done") → на экране одно слово: done.
Почему это важно:
Многие разработчики (даже опытные) думают, что else в цикле — это "если условие в цикле не сработало". На самом деле это "если цикл дошёл до конца". Путаница приводит к багам в поиске и валидации данных. for/else — полезный паттерн, но с контринтуитивным синтаксисом.
Подробное объяснение:
1️⃣ Python использует банковское округление (round half to even), а не привычное школьное «в большую сторону».
2️⃣ Когда число ровно посередине между двумя целыми, округляется к ближайшему чётному.
3️⃣ round(2.5) → 2 (ближайшее чётное).
4️⃣ round(3.5) → 4 (ближайшее чётное).
5️⃣ round(4.5) → 4 (ближайшее чётное).
Почему это важно:
В финансовых расчётах и при подсчёте статистики это может привести к расхождениям с ожидаемыми результатами. Стандарт IEEE 754 так округляет, чтобы уменьшить систематическую ошибку при большом количестве операций. Для точных десятичных вычислений (деньги, налоги) используйте Decimal из модуля decimal.
Подробное объяснение:
1️⃣Выражение (5) — это просто число 5 в скобках, как в математике. Тип остаётся int.
2️⃣Выражение (5,) — кортеж из одного элемента, запятая обязательна.
3️⃣Метод type(x).__name__ возвращает строку с именем класса.
4️⃣На экран выводится int tuple.
Почему это важно
Это типичная ошибка при возврате кортежа из функции (return (value) вместо return (value,)). Если забыть запятую, функция вернёт не коллекцию, а одиночное значение, что ломает распаковку и всю downstream-логику.
Любите хардкорные айтишные квизы?
SourceCraft и Tproger выкатили залипательную браузерную игру-викторину для разработчиков. Рутину написания кода перенесли в космический сеттинг: получилась планетарная система, где на каждой орбите спрятана инженерная загадка.
Интерактивный квест с вопросами о космосе и реальными призами: https://tprg.ru/YQLj
@quiz_python
Подробное объяснение:
1️⃣any(...) получает генератор, а значит элементы вычисляются по одному, а не все сразу.
2️⃣check(0) печатает 0 и возвращает False.
3️⃣check(1) печатает 1 и тоже возвращает False.
4️⃣check(2) печатает 2 и возвращает True, после чего any() сразу завершает работу.
5️⃣check(3) уже не вызывается, и итоговый вывод: 0 1 2 True.
Почему это важно
Это полезно для производительности и для контроля побочных эффектов. Если функция дорогая или что-то печатает, пишет в лог, делает запросы, короткое замыкание может сильно изменить поведение программы.
Автотесты, системная разработка, администрирование, работа с железом — Python используется везде, но задачи в этих направлениях сильно отличаются
Вместе с YADRO сделали квиз из 7 вопросов на основе реальных инженерных задач. Без правильных ответов — просто выбираете, что вам ближе по мышлению.
На выходе — вердикт по вашему направлению (в том числе автоматизация на Python), описание задач, а также ориентиры по зарплатам на старте и дальше.
Пройти квиз: https://tprg.ru/10FR
По шагам:
1️⃣Создаётся объект x класса AlwaysEqual.
2️⃣Выражение x == None вызывает метод x.__eq__(None), который всегда возвращает True.
3️⃣Выражение x is None не вызывает __eq__, а просто проверяет: это тот же самый объект, что и None, или нет.
4️⃣x — обычный экземпляр класса, а не объект None, поэтому результат False.
5️⃣На экран выводится True False.
Почему это важно:
Проверку на None нужно писать только через is None и is not None. Иначе перегруженный __eq__ может дать неожиданный результат и сломать логику условий.
