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

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

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

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

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

1️⃣Цикл for i in range(3) запускается: i принимает значения 0, 1, 2

2️⃣На каждой итерации создаётся лямбда lambda: i — но она не запоминает текущее значение i, а сохраняет лишь ссылку на имя i

3️⃣Список funcs теперь содержит три функции, каждая смотрит на одно и то же имя i

4️⃣Цикл завершился — переменная i в области видимости равна 2

5️⃣f() вызывается для первой лямбды → ищет i → находит 2 → возвращает 2

6️⃣То же самое для второй и третьей лямбды

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

Почему это важно
Классическая ловушка при создании коллбэков в цикле. Чтобы зафиксировать значение в момент создания, используйте аргумент по умолчанию: lambda i=i: i — он вычисляется сразу при создании функции.
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Что выведет код?
Anonymous Quiz
25%
1
65%
2
8%
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
2
Что выведет код?
Anonymous Quiz
9%
0
67%
5
15%
6
10%
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
15%
3 maybe
17%
2 no
7%
2 maybe
27%
1 yes
33%
1 maybe
1
Подробное объяснение (по шагам)

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
5