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
Что выведет код?
Anonymous Quiz
24%
1
66%
2
7%
None
3%
Error
2
Разбор по шагам

1️⃣Вызывается test()

2️⃣Выполняется блок try, доходим до return 1

3️⃣Python запоминает, что нужно вернуть 1, но перед выходом из функции обязан выполнить блок finally

4️⃣Входим в finally → встречаем return 2

5️⃣Запомненное значение 1 безвозвратно отбрасывается

6️⃣Функция завершается с возвратом 2

7️⃣print(2) выводит 2

Почему это важно
Никогда не используйте операторы управления потоком (return, break, continue) внутри finally. Это антипаттерн: он может скрывать исключения и ломать ожидаемую логику возврата значений из функции.
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Что выведет код?
Anonymous Quiz
9%
0
64%
5
13%
6
14%
Error
2
Подробное объяснение

1️⃣Под капотом Python булевы значения являются обычными числами: True ведёт себя как 1, а False как 0.

2️⃣Первое действие в скобках: (x + y) превращается в (1 + 0), что даёт 1.

3️⃣Затем происходит умножение: 1 * 5 равно 5.

4️⃣Второе действие в скобках: (x == y) проверяет, равно ли True значению False. Это ложь, поэтому возвращается False, которое в математическом контексте равно 0.

5️⃣Итоговое сложение: 5 + 0 даёт результат 5.

Почему это важно
С одной стороны, это позволяет писать изящные счётчики вроде sum(x > 0 for x in lst). С другой стороны, неочевидное смешивание булевых значений и арифметики может запутать читателя кода, поэтому злоупотреблять этим не стоит.
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Что выведет код?
Anonymous Quiz
19%
3 maybe
22%
2 no
6%
2 maybe
25%
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
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