Python: задачки и вопросы
7.38K subscribers
1.31K 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️⃣Сравнение с ["𝚊", "𝚋", "𝚌"] иногда даёт True, иногда False.

Почему это важно
Задача показывает, что «неупорядоченность» множеств — не абстракция, а реальное поведение, особенно для строк. Код, который случайно работал на целых числах, может сломаться при переходе на строковые ключи. Если порядок важен — используйте 𝚜𝚘𝚛𝚝𝚎𝚍(𝚜) или другую структуру данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Что выведет код?
Anonymous Quiz
58%
full
31%
empty
9%
Error
3%
None
👀1
Развёрнутое пояснение

1️⃣Создаётся объект 𝚋𝚊𝚐 с пустым списком 𝚒𝚝𝚎𝚖𝚜 = [].

2️⃣При проверке 𝚒𝚏 𝚋𝚊𝚐 Python сначала ищет __𝚋𝚘𝚘𝚕__ — его нет. Затем ищет __𝚕𝚎𝚗__ — тоже нет.

3️⃣Если ни один из методов не определён, объект считается truthy по умолчанию (он же существует!).

4️⃣Поэтому условие истинно и печатается full, хотя 𝚋𝚊𝚐.𝚒𝚝𝚎𝚖𝚜 пуст.

Почему это важно
Многие ожидают, что 𝚒𝚏 𝚋𝚊𝚐 проверит содержимое, но Python не «заглядывает» внутрь объекта автоматически. Пустой список — falsy, но объект, содержащий пустой список — truthy. Чтобы получить ожидаемое поведение, нужно явно добавить __𝚕𝚎𝚗__ или __𝚋𝚘𝚘𝚕__, либо проверять 𝚒𝚏 𝚋𝚊𝚐.𝚒𝚝𝚎𝚖𝚜.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62
Что выведет код?
Anonymous Quiz
18%
4
42%
5
32%
-5
8%
Error
😁1
Развёрнутое пояснение

1️⃣Список 𝚗𝚞𝚖𝚜 = [-𝟻, 𝟸, -𝟹, 𝟺]. Функция 𝚖𝚊𝚡 ищет элемент с максимальным значением.

2️⃣Параметр 𝚔𝚎𝚢=𝚊𝚋𝚜 означает: сравнивать элементы по их абсолютным значениям, то есть 𝟻, 𝟸, 𝟹, 𝟺.

3️⃣Максимум по модулю — это 𝟻 (от элемента −𝟻).

4️⃣Но 𝚖𝚊𝚡 возвращает сам элемент, а не результат 𝚔𝚎𝚢(𝚎𝚕𝚎𝚖𝚎𝚗𝚝), поэтому результат −𝟻, а не 𝟻.

Почему это важно
Можно ожидать, что 𝚖𝚊𝚡(..., 𝚔𝚎𝚢=𝚏) вернёт 𝚏(𝚡), но это не так. Если нужен именно результат функции, придётся вызвать её отдельно: 𝚊𝚋𝚜(𝚖𝚊𝚡(𝚗𝚞𝚖𝚜, 𝚔𝚎𝚢=𝚊𝚋𝚜)) или 𝚖𝚊𝚡(𝚊𝚋𝚜(𝚡) 𝚏𝚘𝚛 𝚡 𝚒𝚗 𝚗𝚞𝚖𝚜).
Please open Telegram to view this post
VIEW IN TELEGRAM
8😁1
Что выведет код?
Anonymous Quiz
31%
-1
20%
1
26%
2
23%
-2
👍3
Развёрнутое пояснение

1️⃣Python использует формулу: 𝚊 % 𝚋 = 𝚊 − 𝚋 × 𝚏𝚕𝚘𝚘𝚛(𝚊 / 𝚋), где 𝚏𝚕𝚘𝚘𝚛 — округление вниз (к минус бесконечности).

2️⃣Для −𝟽 % 𝟹: деление −𝟽 / 𝟹 = −𝟸.𝟹𝟹..., округление вниз 𝚏𝚕𝚘𝚘𝚛(−𝟸.𝟹𝟹) = −𝟹, остаток: −𝟽 − 𝟹 × (−𝟹) = 𝟸.

3️⃣В C, Java, JavaScript деление округляется к нулю, и там −𝟽 % 𝟹 = −𝟷.

Гвидо ван Россум намеренно выбрал округление вниз: при таком подходе остаток всегда попадает в диапазон [𝟶, 𝚗) при положительном делителе. Это удобно для вычисления номера клетки в сетке, индекса в кольцевом буфере, дня недели. Гвидо объяснял: если нужно округление к нулю, можно написать 𝚒𝚗𝚝(𝚊 / 𝚋), а вот получить «правильное» округление вниз из округления к нулю — сложнее, поэтому Python выбрал более полезный вариант по умолчанию.

Почему это важно
При портировании кода между языками или при работе с отрицательными координатами разница в поведении % может привести к трудноуловимым багам: один и тот же код даст разные результаты в Python и в C/Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
3