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️⃣Переменная 𝚡 указывает на строковый объект "𝚑𝚎𝚕𝚕𝚘".

2️⃣Вызов 𝚡.𝚞𝚙𝚙𝚎𝚛() создаёт новый строковый объект "𝙷𝙴𝙻𝙻𝙾" и возвращает его. Но результат не присвоен никакой переменной — он просто теряется.

3️⃣Переменная 𝚡 по-прежнему указывает на исходный объект "𝚑𝚎𝚕𝚕𝚘".

4️⃣Чтобы получить ожидаемый результат, нужно писать 𝚡 = 𝚡.𝚞𝚙𝚙𝚎𝚛().

5️⃣То же самое относится ко всем строковым методам: 𝚛𝚎𝚙𝚕𝚊𝚌𝚎(), 𝚜𝚝𝚛𝚒𝚙(), 𝚕𝚘𝚠𝚎𝚛() — все они возвращают новую строку.

Почему это важно
Те, кто привык к мутирующим методам списков (𝚊𝚙𝚙𝚎𝚗𝚍, 𝚜𝚘𝚛𝚝), часто ожидают такого же поведения от строковых методов. Забытый 𝚡 = 𝚡.𝚜𝚝𝚛𝚒𝚙() — классический баг при обработке текста.
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Развёрнутое пояснение

1️⃣Словарь 𝚍 = {"𝚊": 𝟷}.

2️⃣Вызов 𝚍.𝚜𝚎𝚝𝚍𝚎𝚏𝚊𝚞𝚕𝚝("𝚊", 𝟿𝟿): ключ "𝚊" уже существует со значением 𝟷, поэтому ничего не меняется. Метод возвращает текущее значение 𝟷.

3️⃣Вызов 𝚍.𝚜𝚎𝚝𝚍𝚎𝚏𝚊𝚞𝚕𝚝("𝚋", 𝟿𝟿): ключа "𝚋" нет, поэтому создаётся пара "𝚋": 𝟿𝟿. Метод возвращает 𝟿𝟿.

4️⃣Итого: 𝚍 = {"𝚊": 𝟷, "𝚋": 𝟿𝟿}.

Почему это важно
Можно перепутать 𝚜𝚎𝚝𝚍𝚎𝚏𝚊𝚞𝚕𝚝 с обычным присваиванием или 𝚞𝚙𝚍𝚊𝚝𝚎. Это полезный паттерн для заполнения словаря значениями по умолчанию без затирания существующих данных, особенно при агрегации: 𝚍.𝚜𝚎𝚝𝚍𝚎𝚏𝚊𝚞𝚕𝚝(𝚔𝚎𝚢, []).𝚊𝚙𝚙𝚎𝚗𝚍(𝚟𝚊𝚕𝚞𝚎)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
Что выведет код?
Anonymous Quiz
66%
True
24%
False
9%
SyntaxError
1%
TypeError
2
Развёрнутое пояснение

1️⃣ В Python цепочка a < b < c разворачивается в a < b and b < c. Здесь выражение разворачивается в (1 < 5) and (5 < 10) and (10 == True).

2️⃣ Первые два условия истинны, но 10 == True ложно, так как True числово равен 1, а не 10. Всё выражение возвращает False.

3️⃣ Если бы нужно было сначала вычислить диапазон, а потом сравнить, следует писать (1 < x < 10) == True.

Почему это важно
Непонимание цепочек сравнения приводит к трудноуловимым багам при случайном смешивании проверки диапазонов с булевыми константами. Всегда расставляйте скобки для явного управления порядком.
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Forwarded from Типичный программист
Победителями премии Тпрогер 🐀становятся...

Здесь играет барабанная дробь и интригующая музыка... Вам нужно только выждать драматическую паузу перед объявлением победителей — в каждой номинации он один, и определяется большинством голосов. Готовы?

В номинации «Продукт года» золотая мышь достается компании:
🐀NetVision за платформу интеллектуального мониторинга СИМ.

В номинации «Облачный продукт года» побеждает компания:
🐀Гравитон с паком виртуализации «Гелиус»

Звание «IT-ивент года» вручается компании:
🐀Островок! за О!Хакатон

И в категории «Дизайн года» первое место занимает компания:
🐀AcademiaDev за интерактивную инсталляцию.

Каждый ваш лайк, голос влияли на исход премии. Давайте поддержим всех — ставьте 🏆участникам, которые хоть и не заняли призового места, но точно остались в сердечке.
И 🔥, если хотите аналогичных активностей и готовы выбирать еще!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN 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