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

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

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

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

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

1️⃣Класс 𝙸𝚝𝚎𝚖 определяет __𝚎𝚚__ для сравнения по значению 𝚡. Объекты 𝚊 и 𝚋 равны: 𝚊 == 𝚋 возвращает True.

2️⃣Но по умолчанию Python предполагает: если объекты могут быть равны по __𝚎𝚚__, то они должны иметь одинаковый хеш. Без явного __𝚑𝚊𝚜𝚑__ это нарушается.

3️⃣Поэтому Python автоматически устанавливает __𝚑𝚊𝚜𝚑__ = 𝙽𝚘𝚗𝚎, делая объекты нехешируемыми.

4️⃣При попытке создать {𝚊, 𝚋} выбрасывается TypeError: unhashable type: 'Item'.

Почему это важно
Если нужны и сравнение, и хеширование (для 𝚜𝚎𝚝/𝚍𝚒𝚌𝚝), определите оба метода: __𝚎𝚚__ и __𝚑𝚊𝚜𝚑__, причём равные объекты должны иметь равные хеши.
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3
Что выведет код?
Anonymous Quiz
34%
True
44%
False
13%
Error
9%
None
👍7
Развёрнутое пояснение

1️⃣Оператор 𝚒𝚗 для строк проверяет, является ли левый операнд подстрокой правого.

2️⃣Пустая строка "" — это строка длины 𝟶. По определению, она является подстрокой любой строки: можно представить, что пустая строка «находится» перед 𝚑, между 𝚑 и 𝚎, между 𝚎 и 𝚕, и так далее.

3️⃣Даже "" 𝚒𝚗 "" возвращает True — пустая строка содержит саму себя.

4️⃣Такое поведение согласуется с тем, как работает 𝚜𝚝𝚛.𝚌𝚘𝚞𝚗𝚝(s, "") — он вернёт 𝚕𝚎𝚗(𝚜) + 𝟷.

Почему это важно
Это может сломать валидацию: проверка 𝚒𝚏 𝚞𝚜𝚎𝚛_𝚒𝚗𝚙𝚞𝚝 𝚒𝚗 𝚊𝚕𝚕𝚘𝚠𝚎𝚍_𝚜𝚝𝚛𝚒𝚗𝚐 пройдёт для пустой строки, даже если это не предполагалось.
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Что выведет код?
Anonymous Quiz
24%
True
69%
3
3%
1
4%
Error
🔥3
Развёрнутое пояснение

1️⃣Исторически в Python не было типа 𝚋𝚘𝚘𝚕 — использовались 𝟶 и 𝟷. Когда 𝚋𝚘𝚘𝚕 добавили, его сделали подклассом 𝚒𝚗𝚝 для обратной совместимости.

2️⃣𝚃𝚛𝚞𝚎 ведёт себя как 𝟷 в арифметических операциях: 𝚃𝚛𝚞𝚎 + 𝚃𝚛𝚞𝚎 = 𝟸, потом 𝟸 + 𝚃𝚛𝚞𝚎 = 𝟹.

3️⃣Это позволяет считать количество истинных значений: 𝚜𝚞𝚖([𝚃𝚛𝚞𝚎, 𝙵𝚊𝚕𝚜𝚎, 𝚃𝚛𝚞𝚎]) вернёт 𝟸.

4️⃣Результат сложения — тип 𝚒𝚗𝚝, а не 𝚋𝚘𝚘𝚕.

Почему это важно
С одной стороны, это удобно для подсчёта: 𝚜𝚞𝚖(𝚡 > 𝟶 𝚏𝚘𝚛 𝚡 𝚒𝚗 𝚗𝚞𝚖𝚜). С другой — может удивить при отладке или сериализации, когда вместо 𝚃𝚛𝚞𝚎 вдруг появляется число.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍2
Продолжим тему про булев тип в Python
🔥1
Что выведет код?
Anonymous Quiz
26%
True True
20%
False False
49%
True False
5%
False True
👍3🔥3
Развёрнутое пояснение

🔘𝚃𝚛𝚞𝚎 — это объект типа 𝚋𝚘𝚘𝚕, а 𝚋𝚘𝚘𝚕 — подкласс 𝚒𝚗𝚝.

🔘𝚒𝚜𝚒𝚗𝚜𝚝𝚊𝚗𝚌𝚎(𝚃𝚛𝚞𝚎, 𝚒𝚗𝚝) проверяет: «является ли 𝚃𝚛𝚞𝚎 экземпляром 𝚒𝚗𝚝 или его подкласса?» — да, потому что 𝚋𝚘𝚘𝚕 наследуется от 𝚒𝚗𝚝. Результат: True.

🔘𝚝𝚢𝚙𝚎(𝚃𝚛𝚞𝚎) == 𝚒𝚗𝚝 проверяет: «является ли точный тип 𝚃𝚛𝚞𝚎 именно 𝚒𝚗𝚝?» — нет, точный тип это 𝚋𝚘𝚘𝚕. Результат: False.

Почему это важно
Для проверки типов почти всегда лучше использовать 𝚒𝚜𝚒𝚗𝚜𝚝𝚊𝚗𝚌𝚎, потому что она учитывает наследование. Проверка 𝚝𝚢𝚙𝚎(...) == нужна редко — только когда важен именно точный тип, без подклассов.
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥3
Что выведет код?
Anonymous Quiz
54%
10 parent
38%
10 затем Error
6%
Error
2%
parent 10
👍3
Развёрнутое пояснение

🔘При создании 𝙲𝚑𝚒𝚕𝚍() вызывается 𝙲𝚑𝚒𝚕𝚍.__𝚒𝚗𝚒𝚝__(), который устанавливает только 𝚜𝚎𝚕𝚏.𝚊𝚐𝚎 = 𝟷𝟶.

🔘Родительский 𝙿𝚊𝚛𝚎𝚗𝚝.__𝚒𝚗𝚒𝚝__() не вызывается автоматически — Python не делает этого за вас.

🔘Атрибут 𝚗𝚊𝚖𝚎 не существует у объекта 𝚌.

🔘𝚌.𝚊𝚐𝚎 возвращает 𝟷𝟶, но 𝚌.𝚗𝚊𝚖𝚎 выбрасывает AttributeError.

Почему это важно
В отличие от некоторых языков, Python не вызывает конструктор родителя автоматически. Если дочерний класс переопределяет __𝚒𝚗𝚒𝚝__, нужно явно вызвать 𝚜𝚞𝚙𝚎𝚛().__𝚒𝚗𝚒𝚝__(...), иначе инициализация родителя не произойдёт.
Please open Telegram to view this post
VIEW IN TELEGRAM
4