Python: задачки и вопросы
الذهاب إلى القناة على Telegram
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media
إظهار المزيد6 963
المشتركون
+124 ساعات
-67 أيام
-6130 أيام
أرشيف المشاركات
Разбор задачи
1️⃣Вызов "".split(",") явно указывает, что нужно резать строку по запятым. Запятых нет, поэтому метод возвращает исходную строку целиком как один элемент: ['']. Длина списка = 1.
2️⃣Вызов "".split() (без аргументов) разбивает строку по любым пробельным символам (пробелы, табы, переносы строк).
3️⃣По спецификации Python, алгоритм .split() без аргументов сначала отбрасывает все пробелы по краям, а пустые строки полностью игнорирует.
4️⃣В результате для пустой (или состоящей только из пробелов) строки он возвращает пустой список []. Длина — 0.
Почему это важно
Это неочевидное различие регулярно приводит к падениям скриптов при парсинге логов или CSV-файлов. Если вы ожидаете получить список токенов, а получаете пустой список вместо [''], обращение по индексу (например, chars[0]) вызовет IndexError.
В отличие от предыдущей задачи, в этой есть одно важное изменение, которое меняет правильный ответ.
По шагам:
1️⃣Интерпретатор анализирует тело функции func и замечает операцию x += 1 (которая включает в себя присваивание).
2️⃣Переменная x сразу помечается как локальная для всей функции, полностью перекрывая доступ к глобальной переменной x = 1.
3️⃣При вызове функции первая строка print(x) пытается прочитать локальную x.
4️⃣Так как до выполнения x += 1 локальная переменная еще не инициализирована значениями, возникает исключение UnboundLocalError.
Почему это важно
Это неочевидное проявление лексической области видимости. Если нужно только прочитать глобальную переменную внутри локальной области, проблем не возникнет. Но для её изменения потребуется явно указать global x в начале функции.
По шагам:
1️⃣ Вызов Application() запускает процесс создания инстанса. Первым делом всегда вызывается метод new, который отрабатывает и печатает new
2️⃣ Вместо стандартного создания объекта через super().__new__(cls) наш метод возвращает экземпляр чужого класса Mock
3️⃣ Под капотом Python строго проверяет тип возвращенного объекта. Если тип совпадает с запрошенным cls, интерпретатор вызывает init
4️⃣ Поскольку мы передали объект класса Mock, Python видит, что инициализировать его через Application.__init__ логически неверно, и просто пропускает этот шаг
5️⃣ В итоге на экран выводится только строка new
Почему это важно
Глубокое понимание скрытых механик языка и архитектурных паттернов отличает уверенного инженера от новичка. Если вы хотите систематизировать эти знания и ускорить карьерный рост, обратите внимание на курс Middle Python от Яндекс Практикума PRO. Программа разработана для специалистов с опытом: там нет базового синтаксиса, весь фокус направлен на хардкорную практику, асинхронную архитектуру и профилирование нагрузки. Это позволяет усилить уже имеющийся опыт и уверенно забирать задачи уровня middle.
Реклама. Рекламодатель: АНО ДПО «Образовательные технологии Яндекса» ИНН 7704282033, erid: 2W5zFJVPBbP
По шагам:
1️⃣Переменная x объявляется в глобальной области видимости и получает значение 1.
2️⃣При вызове функции func интерпретатор встречает команду вывода переменной x.
3️⃣Поскольку внутри функции нет своей локальной переменной с таким именем, Python по правилу разрешения областей видимости (LEGB) поднимается на один уровень выше.
4️⃣В глобальной области находится нужная переменная, и на экран штатно выводится 1.
Почему это важно
Это базовое правило работы с областями видимости. Важно твёрдо помнить, что чтение глобальных переменных работает прозрачно и «из коробки». Иногда новички ищут здесь подвох, ожидая ошибку, но проблемы начинаются только в момент попытки изменить такую переменную.
По шагам:
1️⃣Интерпретатор начинает чтение инструкции по созданию нового класса MyBool.
2️⃣В качестве родительского класса передаётся встроенный тип bool.
3️⃣В исходном коде CPython для структуры класса bool отсутствует специальный флаг Py_TPFLAGS_BASETYPE, который разрешает другим классам расширять его.
4️⃣Создание класса немедленно отклоняется с ошибкой TypeError: type 'bool' is not an acceptable base type.
5️⃣До функции print поток выполнения программы даже не добирается.
Почему это важно
Это редкий пример жёсткого архитектурного ограничения в гибком Python. Понимание того, что базовые концепции истины и лжи аппаратно защищены от переопределения, уберегает от странных идей по созданию собственных логических типов, которые могли бы сломать стандартные проверки if в чужом коде.
Подробное объяснение (по шагам)
1️⃣При создании словаря сначала добавляется пара True: "yes".
2️⃣Затем интерпретатор видит ключ 1. Так как тип bool наследуется от int, для питона True == 1. Их хэши тоже равны. Вместо создания нового ключа, обновляется значение старого: словарь становится {True: "no"}.
3️⃣Затем идёт ключ 1.0. Значение 1.0 == 1 == True. Снова происходит перезапись значения по существующему ключу.
4️⃣Итоговый словарь выглядит так: {True: "maybe"}. Его длина равна 1.
5️⃣При обращении d[True] мы получаем последнее сохранённое значение — "maybe".
Почему это важно
Задачка наглядно демонстрирует устройство хэш-таблиц (словарей и множеств) под капотом. Ключи считаются одинаковыми не по совпадению типов, а если их хэши равны (hash(a) == hash(b)) и сами объекты равны (a == b). Это нужно помнить при смешивании разных числовых типов в ключах.
