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

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

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

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

Другие наши проекты: https://tprg.ru/media
Download Telegram
Подробное объяснение (по шагам)

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
20%
False
15%
TypeError
4%
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
7
Что выведет код?
Anonymous Quiz
60%
1
11%
None
16%
NameError
14%
UnboundLocalError
3
По шагам:

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
28%
new
20%
init
6%
TypeError
6
Что выведет код?
Anonymous Quiz
51%
1
12%
2
3%
None
23%
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
42%
0 0
18%
1 1
15%
0 1
26%
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
18%
True True
61%
True False
11%
False True
11%
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
Что выведет код?
Anonymous Quiz
38%
0 1 2 3 True
24%
0 1 2 True
13%
0 1 False
25%
True
2