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️⃣Выражение t[1] += [3] под капотом разбивается на две операции: t[1].__iadd__([3]) и последующее присваивание t[1] = ...

2️⃣Первый шаг выполняется успешно — метод __iadd__ мутирует список на месте, и он становится [2, 3].

3️⃣Второй шаг (присваивание обратно по индексу) бросает TypeError, так как кортежи неизменяемы.

4️⃣Ошибка перехватывается блоком except, где выводится строка 'Error ' без перехода на новую строку.

5️⃣Выполнение продолжается, и print(t) выводит кортеж с уже изменённым списком: (1, [2, 3]).

Почему это важно
Пример наглядно показывает, почему хранение мутабельных объектов (списков) внутри иммутабельных (кортежей) — плохая архитектурная практика. Операции над ними могут вызывать ошибки, но при этом оставлять данные в изменённом (грязном) состоянии.
Please open Telegram to view this post
VIEW IN TELEGRAM
9
Объяснение по шагам

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
34%
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