Python: задачки и вопросы – Telegram
Python: задачки и вопросы
7.36K subscribers
1.32K photos
1 video
1 file
123 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

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

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

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

Другие наши проекты: https://tprg.ru/media
Download Telegram
Развёрнутое пояснение

1️⃣Список [𝟷] содержит только один элемент.

2️⃣Распаковка 𝚏𝚒𝚛𝚜𝚝, *𝚖𝚒𝚍𝚍𝚕𝚎, 𝚕𝚊𝚜𝚝 требует: один элемент для 𝚏𝚒𝚛𝚜𝚝, ноль или более для 𝚖𝚒𝚍𝚍𝚕𝚎, один элемент для 𝚕𝚊𝚜𝚝.

3️⃣​Минимум нужно 𝟸 элемента (𝚏𝚒𝚛𝚜𝚝 + 𝚕𝚊𝚜𝚝), а в списке только 𝟷.

4️⃣Python выбрасывает ValueError: not enough values to unpack (expected at least 2, got 1).

Почему это важно
Звёздочка создаёт иллюзию «гибкости», но фиксированные переменные вокруг неё всё равно требуют своих значений. Это ломает код, когда данные короче ожидаемого, например при парсинге строк или обработке коротких списков.
Please open Telegram to view this post
VIEW IN TELEGRAM
32
Развёрнутое пояснение

1️⃣Множество 𝚜 = {"𝚊", "𝚋", "𝚌"} содержит три строки, но их внутренний порядок зависит от хеш-функции.

2️⃣В отличие от целых чисел (где 𝚑𝚊𝚜𝚑(𝚗) == 𝚗), для строк хеш вычисляется с использованием случайного сида, который меняется при каждом запуске интерпретатора.

3️⃣Три вызова 𝚜.𝚙𝚘𝚙() извлекают элементы в текущем внутреннем порядке — это может быть ["𝚋", "𝚌", "𝚊"], ["𝚊", "𝚌", "𝚋"], ["𝚌", "𝚋", "𝚊"] и так далее.

4️⃣Сравнение с ["𝚊", "𝚋", "𝚌"] иногда даёт True, иногда False.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Почему это важно
При портировании кода между языками или при работе с отрицательными координатами разница в поведении % может привести к трудноуловимым багам: один и тот же код даст разные результаты в Python и в C/Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Что выведет код?
Anonymous Quiz
30%
True
61%
False
6%
Error
3%
None
👍4
Развёрнутое пояснение

1️⃣Десятичная дробь 𝟶.𝟷 в двоичной системе — это бесконечная периодическая дробь, как 𝟷/𝟹 в десятичной. Компьютер хранит только приближение.

2️⃣То же самое с 𝟶.𝟸: сохраняется не точное значение, а ближайшее представимое в формате 𝚏𝚕𝚘𝚊𝚝.

3️⃣При сложении погрешности накапливаются, и результат 𝟶.𝟷 + 𝟶.𝟸 равен примерно 𝟶.𝟹𝟶𝟶𝟶𝟶𝟶𝟶𝟶𝟶𝟶𝟶𝟶𝟶𝟶𝟶𝟶𝟺.

4️⃣Сравнение с 𝟶.𝟹 (которое тоже хранится с погрешностью, но другой) даёт False.

Почему это важно

Сравнивать 𝚏𝚕𝚘𝚊𝚝 через == почти всегда неправильно. Для денег и точных вычислений используют модуль 𝚍𝚎𝚌𝚒𝚖𝚊𝚕, для приближённых сравнений — 𝚖𝚊𝚝𝚑.𝚒𝚜𝚌𝚕𝚘𝚜𝚎(𝚊, 𝚋) или проверку 𝚊𝚋𝚜(𝚊 - 𝚋) < 𝚎𝚙𝚜𝚒𝚕𝚘𝚗.
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Развёрнутое пояснение

Python сравнивает кортежи лексикографически: сначала первые элементы, потом вторые и так далее.

1️⃣Элемент 𝟶: 𝟷 == 𝟷 — равны, идём дальше.

2️⃣Элемент 𝟷: 𝟸 == 𝟸 — равны, идём дальше.

3️⃣У кортежа 𝚊 элементы закончились, а у 𝚋 ещё есть. По правилу: если один кортеж — префикс другого, то более короткий считается меньшим.

4️⃣Поэтому (𝟷, 𝟸) < (𝟷, 𝟸, 𝟶) возвращает True, даже несмотря на то что третий элемент 𝚋 — это 𝟶.

Почему это важно
Это поведение совпадает с сортировкой слов в словаре: «кот» < «кота». Но при сортировке данных (например, версий (𝟷, 𝟸) vs (𝟷, 𝟸, 𝟶)) результат может быть неожиданным, если не учитывать правило «короче = меньше».
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Что выведет код?
Anonymous Quiz
56%
None X
23%
X X
13%
None None
8%
X None
👨‍💻1