Python: задачки и вопросы
7.65K subscribers
1.21K photos
2 videos
1 file
101 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

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

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

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

Другие наши проекты: https://tprg.ru/media
Download Telegram
🧩 Что выведет код?
Anonymous Quiz
3%
1
18%
2
66%
3
13%
Error
👍3💩2👎1
Марк Лутц, «Изучаем Python», глава 36:

Использование пустой конструкции except может привести к серьезным проблемам:

«Программист здесь предполагает, что единственным видом ошибок, которые могут произойти при индексировании словаря, будет отсутствующий ключ. Но поскольку имя myditctionary написано неправильно (должно быть mydictionary), интерпретатор Python взамен генерирует исключение NameError для ссылки на неопределенное имя, которое обработчик молча перехватывает и игнорирует».

Что происходит в коде:
— Переменная mydictionary определена корректно;
— В блоке try используется неправильное имя myditctionary (с опечаткой);
— Это вызывает NameError, а не ожидаемый KeyError;
— Пустой except перехватывает любую ошибку, включая NameError;
— Программа продолжает выполнение, маскируя реальную проблему.

«В качестве эмпирического правила: будьте в своих обработчиках как можно более конкретными — пустые конструкции except и перехват суперкласса Exception удобны, но потенциально подвержены ошибкам».
👍3👎1
Что выведет код?
Anonymous Quiz
26%
True
59%
False
1%
None
14%
Error
1👍1👎1
Из документации Python:

Причина вывода False — разные типы данных:

🔘 Литерал с префиксом u создаёт объект типа 𝚜𝚝𝚛 (Unicode-строка);
🔘 Литерал с префиксом b создаёт объект типа 𝚋𝚢𝚝𝚎𝚜 (байтовая строка).

В Python 3 это принципиально разные типы. Сравнение 𝚜𝚝𝚛 == 𝚋𝚢𝚝𝚎𝚜 всегда возвращает False, даже если они визуально одинаковы, потому что объекты разных типов не равны.

В официальной документации Python указано:

«Байтовые литераты всегда сопровождаются префиксом b, это генерирует объект типа 𝚋𝚢𝚝𝚎𝚜, не 𝚜𝚝𝚛».

«Поддержка устаревшего Unicode-литерала (u'spam') была вновь введена для упрощения поддержки кода, работающего как на Python 2.x, так и на Python 3.x».
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1👎1
Из документации Python:

«При работе с JSON-файлами в текстовом формате используйте encoding="utf-8" при открытии файла для чтения и записи».

𝚏 = 𝚘𝚙𝚎𝚗('𝚠𝚘𝚛𝚔𝚏𝚒𝚕𝚎', '𝚠', 𝚎𝚗𝚌𝚘𝚍𝚒𝚗𝚐="𝚞𝚝𝚏-𝟾")

Почему вариант 1 — правильный

🔘Он непосредственно позволяет указать желаемую кодировку при чтении или записи файла.
🔘Это прямой и стандартный подход, предусмотренный в языке (без дополнительных преобразований вручную).

Другие варианты (например, str.encode() с записью байтов, использование JSON или pickle) не являются подходящими для создания текстового файла в нужной кодировке — они либо статичны, либо служат для других целей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
🪤 Что выведет код?
Anonymous Quiz
68%
1
6%
2
14%
3
12%
Error
2👍1👎1
Зацените как похорошели транскрибации при Войси!

Вайб-кодинг вайб-кодингом, но как же не хватает простого человеческого «расшифруй мне созвон, только качественно!!». С этим вам поможет Войси.

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

Самое удобное, что далеко ходить не надо — всё это делается прямо в «телеге». Экономьте своё время, превращая часы в минуты.

🔥А новичкам доступны 1,5 часа бесплатной транскрибации. Забирайте: https://tprg.ru/9xQo
👍1
🧩 Что выведет код?
Anonymous Quiz
50%
1
36%
2
11%
3
4%
Error
👍2👎1
Код демонстрирует работу оператора 𝚍𝚎𝚕 с методом __𝚍𝚎𝚕𝚊𝚝𝚝𝚛__, который автоматически вызывается при удалении атрибутов объекта.

Из документации Python:

«Оператор 𝚍𝚎𝚕 используется для удаления элементов из списков, переменных и атрибутов объектов».

В данном случае:

🔘 При выполнении 𝚍𝚎𝚕 𝚋𝚘𝚋.𝚗𝚊𝚖𝚎 интерпретатор автоматически вызывает метод __𝚍𝚎𝚕𝚊𝚝𝚝𝚛__.
🔘 В параметр 𝚊𝚝𝚝𝚛 передаётся имя атрибута 𝚗𝚊𝚖𝚎.
🔘 Метод выводит '𝚍𝚎𝚕: ' + 𝚊𝚝𝚝𝚛, то есть 𝚍𝚎𝚕: 𝚗𝚊𝚖𝚎.
🔘 Затем проверяется условие 𝚒𝚏 𝚊𝚝𝚝𝚛 == '𝚗𝚊𝚖𝚎' — оно истинно.
🔘 Переменная 𝚊𝚝𝚝𝚛 переназначается на '_𝚗𝚊𝚖𝚎' для работы с внутренним атрибутом.
🔘 Выполняется 𝚍𝚎𝚕 𝚜𝚎𝚕𝚏.__𝚍𝚒𝚌𝚝__[𝚊𝚝𝚝𝚛], что удаляет атрибут _𝚗𝚊𝚖𝚎 из словаря объекта.

Важно понимать, что метод __𝚍𝚎𝚕𝚊𝚝𝚝𝚛__ получает именно то имя атрибута, которое было указано в операторе 𝚍𝚎𝚕, а не внутреннее имя _𝚗𝚊𝚖𝚎. Это позволяет создавать "виртуальные" атрибуты, которые на самом деле управляют другими внутренними атрибутами объекта.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
Свойства исполняют особую роль, в то время как дескрипторы более универсальны. Свойства определяют функции извлечения, установки и удаления для конкретного атрибута; дескрипторы снабжают класс методами для таких действий, но предоставляют добавочную гибкость с целью поддержки более произвольных действий. На самом деле свойства являются простым способом создания специфического вида дескриптора — такого, который запускает функции при доступе к атрибутам. Реализация тоже отличается: свойство создается с помощью встроенной функции, а дескриптор — посредством класса; таким образом, дескрипторы могут воспользоваться в своих интересах всеми обычными возможностями ООП, касающимися классов, вроде наследования. Кроме того, вдобавок к информации состояния экземпляра дескрипторы имеют собственное локальное состояние, так что временами они способны избегать конфликтов имен в экземпляре.
👍1👎1
🧩 Что выведет код?
Anonymous Quiz
18%
6, 7
66%
spam
6%
None
11%
Error
Марк Лутц, «Изучаем Python», глава 39:

«Декораторы функций представляют собой синтаксический сахар, который обеспечивает запуск одной функции через другую в конце оператора 𝚍𝚎𝚏 и повторно привязывает имя исходной функции к результату».

«Автоматическая повторная привязка имен объясняет синтаксис декорирования статических методов и свойств:
𝚌𝚕𝚊𝚜𝚜 С:
@𝚜𝚝𝚊𝚝𝚒𝚌𝚖𝚎𝚝𝚑𝚘𝚍
𝚍𝚎𝚏 𝚖𝚎𝚝𝚑 (...): ... # 𝚖𝚎𝚝𝚑 = 𝚜𝚝𝚊𝚝𝚒𝚌𝚖𝚎𝚝𝚑𝚘𝚍 (𝚖𝚎𝚝𝚑)

В обоих случаях имя метода повторно привязывается к результату встроенного декоратора в конце оператора 𝚍𝚎𝚏».
В данной задаче демонстрируется работа декоратора класса, который создает обертку (𝚆𝚛𝚊𝚙𝚙𝚎𝚛) для перехвата доступа к атрибутам экземпляра.

Марк Лутц, «Изучаем Python», глава 𝟹𝟿:

«В приведенном примере декоратор повторно привязывает имя класса к другому классу, который предохраняет исходный класс в объемлющей области видимости и при обращении к исходному классу создает и внедряет его экземпляр. Когда позже из экземпляра извлекается какой−нибудь атрибут, операция перехватывается методом __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ объекта−оболочки и ее выполнение делегируется внедренному экземпляру исходного класса».

Как работает код:

🔘 Декоратор 𝚍𝚎𝚌𝚘𝚛𝚊𝚝𝚘𝚛 принимает класс 𝙲 и возвращает класс 𝚆𝚛𝚊𝚙𝚙𝚎𝚛
🔘 При создании экземпляра 𝚡 = 𝙲(𝟼, 𝟽) фактически создается экземпляр 𝚆𝚛𝚊𝚙𝚙𝚎𝚛
🔘 В конструкторе 𝚆𝚛𝚊𝚙𝚙𝚎𝚛.__𝚒𝚗𝚒𝚝__ создается экземпляр исходного класса 𝙲 и сохраняется в 𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍
🔘 При обращении к атрибуту 𝚡.𝚊𝚝𝚝𝚛 срабатывает метод 𝚆𝚛𝚊𝚙𝚙𝚎𝚛.__𝚐𝚎𝚝𝚊𝚝𝚝𝚛__
🔘 Метод __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ делегирует обращение к атрибуту исходному экземпляру через 𝚐𝚎𝚝𝚊𝚝𝚝𝚛(𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍, 𝚗𝚊𝚖𝚎)
Please open Telegram to view this post
VIEW IN TELEGRAM