Python: задачки и вопросы
7.4K 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
Канал по нейронкам, который часто пересекается с Python по темам: @neuro_channel

Веду его тоже я, так что если вам нравятся задачки здесь, то буду рад видеть вас и в «Нейроканале». Это всё часть медиа Tproger.

Три примечательных поста:

1️⃣Про утилиту, которая автоматически снимает цензуру (safety alignment) с трансформерных языковых моделей без дообучения и ручного тюнинга.

2️⃣Разбор сборки GPT‑OSS с нуля на чистом Python, без PyTorch и без GPU: последовательно с объяснениями от Softmax и RMSNorm до Grouped Query Attention.

3️⃣Обзор трендов Hugging Face за неделю с супер-кратким описанием моделей, выходит регулярно.

Плюс новости о выходе новых нейронок, чтобы не пропустить ничего важного. Все свежие громкие релизы, чтобы вы могли читать только один канал. Иногда получается даже раньше официального запуска, чем я особенно горжусь :)

Заходите и подписывайтесь:
@neuro_channel
Please open Telegram to view this post
VIEW IN TELEGRAM
1🙏1
Что выведет код?
Anonymous Quiz
62%
A
20%
B
12%
A B
7%
Error
Развёрнутое пояснение

1️⃣Вызов 𝚒𝚗𝚝("𝚊𝚋𝚌") выбрасывает 𝚅𝚊𝚕𝚞𝚎𝙴𝚛𝚛𝚘𝚛, потому что строка не является числом.

2️⃣Python идёт по 𝚎𝚡𝚌𝚎𝚙𝚝-блокам сверху вниз и проверяет, является ли выброшенное исключение экземпляром указанного класса.

3️⃣Первый блок ловит 𝙴𝚡𝚌𝚎𝚙𝚝𝚒𝚘𝚗; так как 𝚅𝚊𝚕𝚞𝚎𝙴𝚛𝚛𝚘𝚛 наследуется от 𝙴𝚡𝚌𝚎𝚙𝚝𝚒𝚘𝚗, условие выполняется, печатается A, и обработка завершается.

4️⃣Блок 𝚎𝚡𝚌𝚎𝚙𝚝 𝚅𝚊𝚕𝚞𝚎𝙴𝚛𝚛𝚘𝚛 становится «мёртвым кодом» — он никогда не выполнится.

Почему это важно
Правило: более специфичные исключения должны идти перед более общими. Иначе общий 𝚎𝚡𝚌𝚎𝚙𝚝 «съест» все ошибки, и специфичная обработка не сработает. В современном Python (3.11+) на это даже выдаётся SyntaxWarning. Да pyright подсветит, но в учебном примере я специально убрал подсветку.
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Развёрнутое пояснение

1️⃣Функция 𝚐𝚛𝚎𝚎𝚝 вызывается с аргументом "" (пустая строка), поэтому параметр 𝚗𝚊𝚖𝚎 получает значение "".

2️⃣В строке 𝚗𝚊𝚖𝚎 = 𝚗𝚊𝚖𝚎 𝚘𝚛 "𝙶𝚞𝚎𝚜𝚝" оператор 𝚘𝚛 проверяет истинность левого операнда: пустая строка "" — falsy-значение.

3️⃣Так как левый операнд ложный, 𝚘𝚛 возвращает правый операнд "𝙶𝚞𝚎𝚜𝚝", и переменная 𝚗𝚊𝚖𝚎 перезаписывается.

4️⃣Функция возвращает "𝙷𝚎𝚕𝚕𝚘, 𝙶𝚞𝚎𝚜𝚝!", хотя намерение было — приветствовать пустым именем.

Почему это важно
Паттерн 𝚡 𝚘𝚛 𝚍𝚎𝚏𝚊𝚞𝚕𝚝 ломается для любых falsy-значений: 𝟶, "", [], 𝙽𝚘𝚗𝚎, 𝙵𝚊𝚕𝚜𝚎. Безопасная альтернатива — явная проверка: 𝚒𝚏 𝚗𝚊𝚖𝚎 𝚒𝚜 𝙽𝚘𝚗𝚎: 𝚗𝚊𝚖𝚎 = "𝙶𝚞𝚎𝚜𝚝".
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Что выведет код?
Anonymous Quiz
9%
1 [] 1
14%
1 [1] 1
13%
1 [] None
63%
Error
👍2💊1
Развёрнутое пояснение

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
31
Развёрнутое пояснение

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

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

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

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

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

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

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

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

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

Почему это важно
Многие ожидают, что 𝚒𝚏 𝚋𝚊𝚐 проверит содержимое, но Python не «заглядывает» внутрь объекта автоматически. Пустой список — falsy, но объект, содержащий пустой список — truthy. Чтобы получить ожидаемое поведение, нужно явно добавить __𝚕𝚎𝚗__ или __𝚋𝚘𝚘𝚕__, либо проверять 𝚒𝚏 𝚋𝚊𝚐.𝚒𝚝𝚎𝚖𝚜.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3