Python: задачки и вопросы
7.17K subscribers
1.35K photos
1 video
1 file
124 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Что выведет код?
Anonymous Quiz
17%
3 maybe
22%
2 no
6%
2 maybe
27%
1 yes
29%
1 maybe
3
Подробное объяснение (по шагам)

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). Это нужно помнить при смешивании разных числовых типов в ключах.
Please open Telegram to view this post
VIEW IN TELEGRAM
7
Что выведет код?
Anonymous Quiz
61%
True
21%
False
15%
TypeError
3%
NameError
4
По шагам:

1️⃣Интерпретатор начинает чтение инструкции по созданию нового класса MyBool.

2️⃣В качестве родительского класса передаётся встроенный тип bool.

3️⃣В исходном коде CPython для структуры класса bool отсутствует специальный флаг Py_TPFLAGS_BASETYPE, который разрешает другим классам расширять его.

4️⃣Создание класса немедленно отклоняется с ошибкой TypeError: type 'bool' is not an acceptable base type.

5️⃣До функции print поток выполнения программы даже не добирается.

Почему это важно
Это редкий пример жёсткого архитектурного ограничения в гибком Python. Понимание того, что базовые концепции истины и лжи аппаратно защищены от переопределения, уберегает от странных идей по созданию собственных логических типов, которые могли бы сломать стандартные проверки if в чужом коде.
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Что выведет код?
Anonymous Quiz
61%
1
12%
None
16%
NameError
11%
UnboundLocalError
2
По шагам:

1️⃣Переменная x объявляется в глобальной области видимости и получает значение 1.

2️⃣При вызове функции func интерпретатор встречает команду вывода переменной x.

3️⃣Поскольку внутри функции нет своей локальной переменной с таким именем, Python по правилу разрешения областей видимости (LEGB) поднимается на один уровень выше.

4️⃣В глобальной области находится нужная переменная, и на экран штатно выводится 1.

Почему это важно
Это базовое правило работы с областями видимости. Важно твёрдо помнить, что чтение глобальных переменных работает прозрачно и «из коробки». Иногда новички ищут здесь подвох, ожидая ошибку, но проблемы начинаются только в момент попытки изменить такую переменную.
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Что выведет код?
Anonymous Quiz
46%
new init
30%
new
20%
init
4%
TypeError
5
По шагам:

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
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Что выведет код?
Anonymous Quiz
51%
1
11%
2
3%
None
24%
UnboundLocalError
11%
NameError
7
В отличие от предыдущей задачи, в этой есть одно важное изменение, которое меняет правильный ответ.

По шагам:


1️⃣Интерпретатор анализирует тело функции func и замечает операцию x += 1 (которая включает в себя присваивание).

2️⃣Переменная x сразу помечается как локальная для всей функции, полностью перекрывая доступ к глобальной переменной x = 1.

3️⃣При вызове функции первая строка print(x) пытается прочитать локальную x.

4️⃣Так как до выполнения x += 1 локальная переменная еще не инициализирована значениями, возникает исключение UnboundLocalError.

Почему это важно
Это неочевидное проявление лексической области видимости. Если нужно только прочитать глобальную переменную внутри локальной области, проблем не возникнет. Но для её изменения потребуется явно указать global x в начале функции.
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Что выведет код?
Anonymous Quiz
44%
0 0
15%
1 1
16%
0 1
25%
1 0
4
Разбор задачи

1️⃣Вызов "".split(",") явно указывает, что нужно резать строку по запятым. Запятых нет, поэтому метод возвращает исходную строку целиком как один элемент: ['']. Длина списка = 1.

2️⃣Вызов "".split() (без аргументов) разбивает строку по любым пробельным символам (пробелы, табы, переносы строк).

3️⃣По спецификации Python, алгоритм .split() без аргументов сначала отбрасывает все пробелы по краям, а пустые строки полностью игнорирует.

4️⃣В результате для пустой (или состоящей только из пробелов) строки он возвращает пустой список []. Длина — 0.

Почему это важно
Это неочевидное различие регулярно приводит к падениям скриптов при парсинге логов или CSV-файлов. Если вы ожидаете получить список токенов, а получаете пустой список вместо [''], обращение по индексу (например, chars[0]) вызовет IndexError.
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Что выведет код?
Anonymous Quiz
17%
True True
61%
True False
9%
False True
13%
False False
2
По шагам:

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__ может дать неожиданный результат и сломать логику условий.
Please open Telegram to view this post
VIEW IN TELEGRAM
4