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

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

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

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

Другие наши проекты: https://tprg.ru/media
Download Telegram
Всем тимлидам, разработчикам, тестировщикам и админам!

Счастливого Дня программиста!

Желаем вам всегда зелёных билдов, отзывчивых кластеров и тихих дежурных смен. Пусть ваши логи будут чисты от ошибок, а мониторинг предупреждает о проблемах раньше, чем о них узнают пользователи.

И чтобы пожелание точно сбылось, обязательно воспользуйтесь подарками из нашей IT-коробки. Готовили с любовью в сердце вместе с нашими друзьями.

С праздником!
❤‍🔥1
🪤 Что выведет код?
Anonymous Quiz
52%
Bob Sue
24%
Bob Bob
17%
Sue Sue
7%
Error
👍1👎1
В данном коде демонстрируется корректная работа декоратора 𝚃𝚛𝚊𝚌𝚎𝚛 с множественными экземплярами.

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

«Однако, как теоретически обсуждалось ранее, такая альтернатива, где используются только классы, подвержена множеству классов, но не вполне нормально работает с множеством экземпляров заданного класса: каждый вызов, создающий экземпляр, запускает метод __𝚌𝚊𝚕𝚕__, который перезаписывает предыдущий экземпляр».

Механизм работы:

🔘 При создании 𝚋𝚘𝚋 = 𝙿𝚎𝚛𝚜𝚘𝚗('𝙱𝚘𝚋') вызывается метод __𝚌𝚊𝚕𝚕__ декоратора 𝚃𝚛𝚊𝚌𝚎𝚛
🔘 В 𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍 сохраняется экземпляр 𝙿𝚎𝚛𝚜𝚘𝚗 с именем '𝙱𝚘𝚋'
🔘 𝚋𝚘𝚋 ссылается на объект 𝚃𝚛𝚊𝚌𝚎𝚛, который содержит экземпляр 𝙿𝚎𝚛𝚜𝚘𝚗('𝙱𝚘𝚋')
🔘 При создании 𝚜𝚞𝚎 = 𝙿𝚎𝚛𝚜𝚘𝚗('𝚂𝚞𝚎') создается новый объект 𝚃𝚛𝚊𝚌𝚎𝚛
🔘 В новом объекте 𝚃𝚛𝚊𝚌𝚎𝚛 в 𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍 сохраняется экземпляр 𝙿𝚎𝚛𝚜𝚘𝚗 с именем '𝚂𝚞𝚎'
🔘 𝚜𝚞𝚎 ссылается на новый объект 𝚃𝚛𝚊𝚌𝚎𝚛, который содержит экземпляр 𝙿𝚎𝚛𝚜𝚘𝚗('𝚂𝚞𝚎')

При обращении к 𝚋𝚘𝚋.𝚗𝚊𝚖𝚎 и 𝚜𝚞𝚎.𝚗𝚊𝚖𝚎:
🔘 𝚋𝚘𝚋.𝚗𝚊𝚖𝚎 обращается к атрибуту 𝚗𝚊𝚖𝚎 через __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ первого объекта 𝚃𝚛𝚊𝚌𝚎𝚛
🔘 __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ делегирует запрос к 𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍 первого объекта (содержит 𝙿𝚎𝚛𝚜𝚘𝚗('𝙱𝚘𝚋'))
🔘 Поэтому 𝚋𝚘𝚋.𝚗𝚊𝚖𝚎 возвращает '𝙱𝚘𝚋'
🔘𝚜𝚞𝚎.𝚗𝚊𝚖𝚎 обращается к атрибуту 𝚗𝚊𝚖𝚎 через __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ второго объекта 𝚃𝚛𝚊𝚌𝚎𝚛
🔘 __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ делегирует запрос к 𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍 второго объекта (содержит 𝙿𝚎𝚛𝚜𝚘𝚗('𝚂𝚞𝚎'))
🔘 Поэтому 𝚜𝚞𝚎.𝚗𝚊𝚖𝚎 возвращает '𝚂𝚞𝚎'

В данном случае каждый вызов 𝙿𝚎𝚛𝚜𝚘𝚗() создает новый объект 𝚃𝚛𝚊𝚌𝚎𝚛, поэтому проблема с перезаписью экземпляров не проявляется.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
🧩 Что выведет код?
Anonymous Quiz
18%
1
15%
2
60%
3
7%
Error
👍1👎1
В данном коде демонстрируется декоратор регистрации, который добавляет объекты в словарь для будущей обработки.

Предположим, что вы требуете от методов или классов, используемых приложением, регистрации в API−интерфейсе для будущей обработки (может быть, API−интерфейс позже будет обращаться к объектам и отвечать на текущие события). Несмотря на то что это могли бы предоставить регистрационные функции, которые выполняли вызову вручную после того, как объекты определены, декораторы сделают ваше решение более элегантным.

Механизм работы:

🔘 Декоратор 𝚛𝚎𝚐𝚒𝚜𝚝𝚎𝚛 добавляет функции в словарь 𝚛𝚎𝚐𝚒𝚜𝚝𝚛𝚢 по их имени
🔘 При декорировании @𝚛𝚎𝚐𝚒𝚜𝚝𝚎𝚛 функции 𝚜𝚙𝚊𝚖 и 𝚎𝚐𝚐𝚜 автоматически регистрируются
🔘 𝚛𝚎𝚐𝚒𝚜𝚝𝚛𝚢[𝚘𝚋𝚓.__𝚗𝚊𝚖𝚎__] = 𝚘𝚋𝚓 сохраняет ссылку на функцию в словаре
🔘 𝚛𝚎𝚝𝚞𝚛𝚗 𝚘𝚋𝚓 возвращает саму функцию, а не обертку

Поскольку он возвращает сам объект, а не оболочку, он не перехватывает будущие вызовы.

Вывод кода:
🔘 𝚁𝚎𝚐𝚒𝚜𝚝𝚛𝚢: показывает содержимое словаря 𝚛𝚎𝚐𝚒𝚜𝚝𝚛𝚢 с именами функций, их объектами и типами
🔘 𝙼𝚊𝚗𝚞𝚊𝚕 𝚌𝚊𝚕𝚕𝚜: прямые вызовы функций 𝚜𝚙𝚊𝚖(𝟺) = 𝟷𝟼, 𝚎𝚐𝚐𝚜(𝟾) = 𝟻𝟷𝟸
🔘 𝚁𝚎𝚐𝚒𝚜𝚝𝚛𝚢 𝚌𝚊𝚕𝚕𝚜: вызовы функций через словарь 𝚛𝚎𝚐𝚒𝚜𝚝𝚛𝚢 с аргументом 𝟸: 𝚜𝚙𝚊𝚖(𝟸) = 𝟺, 𝚎𝚐𝚐𝚜(𝟸) = 𝟾

Таким образом, регистр хранит ссылки на функции и классы, и их можно вызывать напрямую через регистр.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
🧩 Что выведет код?
Anonymous Quiz
5%
None
86%
Bob is 45 years old
3%
Bob
5%
TypeError
👍1👎1
В данном коде демонстрируется декоратор проверки вхождения значений в диапазон для позиционных аргументов.

🔘 Декоратор @𝚛𝚊𝚗𝚐𝚎𝚝𝚎𝚜𝚝((𝟷, 𝟶, 𝟷𝟸𝟶)) проверяет, что аргумент с индексом 𝟷 (𝚊𝚐𝚎) находится в диапазоне от 𝟶 до 𝟷𝟸𝟶
🔘 Если __𝚍𝚎𝚋𝚞𝚐__ = 𝚃𝚛𝚞𝚎 (режим отладки), функция оборачивается проверкой
🔘 При вызове 𝚙𝚎𝚛𝚜𝚒𝚗𝚏𝚘('𝙱𝚘𝚋', 𝟺𝟻) проверяется: 𝟺𝟻 >= 𝟶 и 𝟺𝟻 <= 𝟷𝟸𝟶
🔘 Условие выполняется, поэтому функция выполняется нормально и выводит «𝙱𝚘𝚋 𝚒𝚜 𝟺𝟻 𝚢𝚎𝚊𝚛𝚜 𝚘𝚕𝚍»

В имеющемся коде объект функции обертывается представленной формой исследования, если активен режим 𝚍𝚎𝚋𝚞𝚐 (по умолчанию 𝚃𝚛𝚞𝚎). В противном случае возвращается сама функция, и код выполняется без дополнительных проверок.

Если бы 𝚊𝚐𝚎 был вне диапазона (например, 𝟷𝟻𝟶), то возникло бы исключение 𝚃𝚢𝚙𝚎𝙴𝚛𝚛𝚘𝚛 с сообщением «𝙰𝚛𝚐𝚞𝚖𝚎𝚗𝚝 𝟷 𝚗𝚘𝚝 𝚒𝚗 𝟶..𝟷𝟸𝟶».
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
😊 Как организовать работу с данными, чтобы не утонуть в бюрократии?
😊 Какие подводные камни ждут при миграции всего банка в облако?
😊 Как силами NLP в 30 раз ускорить обработку клиентских обращений?

В гайдах для начинающих на такие вопросы вряд ли найдется ответ. А вот в телеграм-канале OTP Tech точно найдется наглядный разбор.

В OTP Tech вы получите реальный опыт внедрения сложных решений в продакшен крупного финтеха. Ну и просто фановый интерактив, который поможет разгрузить голову.

Если вы разрабатываете, проектируете или администрируете и хотите смотреть дальше хеллоу ворлдов — вам будет здесь интересно.

Присоединяйтесь: @otp_tech
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
🧩 Как называется параметр ???, который сузит список импортируемых столбцов до заданного списка?
Anonymous Quiz
38%
columns
18%
usecols
19%
col_names
26%
select_columns
👍1👎1
Борис Пасхавер, «Pandas в действии», глава 3:

С помощью параметра 𝚞𝚜𝚎𝚌𝚘𝚕𝚜 функции 𝚛𝚎𝚊𝚍_𝚌𝚜𝚟 можно указать список импортируемых библиотекой 𝚙𝚊𝚗𝚍𝚊𝚜 столбцов.
👍1👎1
🧩 Что выведет код?
Anonymous Quiz
22%
('c', 'd')
9%
('a', 'c', 'd')
53%
('a', 'b', 'c', 'd')
16%
Error
👍1👎1
Атрибут 𝚌𝚘𝚍𝚎 объекта функции предоставляет доступ к объекту кода, который содержит метаданные о функции, включая информацию о локальных переменных и аргументах.

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

«𝚌𝚘𝚍𝚎𝚘𝚋𝚓𝚎𝚌𝚝.𝚌𝚘_𝚟𝚊𝚛𝚗𝚊𝚖𝚎𝚜: кортеж, содержащий имена локальных переменных в функции (начиная с имен параметров)».

В 𝚏𝚞𝚗𝚌() определены:
− Аргументы: 𝚊, 𝚋
− Локальные переменные: 𝚌, 𝚍

𝚌𝚘𝚍𝚎.𝚌𝚘_𝚟𝚊𝚛𝚗𝚊𝚖𝚎𝚜 — все имена локальных переменных. Этот атрибут возвращает кортеж всех локальных переменных функции, включая аргументы и переменные, определенные внутри функции.
👍1👎1
🧩 Что выведет код?
Anonymous Quiz
51%
5.5
15%
(2, 3, 0.5)
5%
5
29%
Error
👎2👍1
В данном коде используется декоратор 𝚛𝚊𝚗𝚐𝚎𝚝𝚎𝚜𝚝 с аргументами для проверки диапазонов значений параметров функции.

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

«Аннотации функций ... можно бы предложить альтернативу — аргументы декоратора, используемые в примере для задания проверок вложения в диапазон».

Декоратор @𝚛𝚊𝚗𝚐𝚎𝚝𝚎𝚜𝚝(𝚊=(𝟷, 𝟻), 𝚌=(𝟶.𝟶, 𝟷.𝟶)) принимает аргументы для проверки диапазонов:
🔘 параметр 𝚊 должен находиться в диапазоне от 𝟷 до 𝟻 (не включительно)
🔘 параметр 𝚌 должен находиться в диапазоне от 𝟶.𝟶 до 𝟷.𝟶 (не включительно)

В данной реализации декоратор является «пустым» — он принимает аргументы, но не выполняет никаких проверок, просто возвращает исходную функцию без изменений.

При вызове 𝚏𝚞𝚗𝚌(𝟸, 𝟹, 𝟶.𝟻) функция выполняется с параметрами:
− 𝚊 = 𝟸
− 𝚋 = 𝟹
− 𝚌 = 𝟶.𝟻

Функция вычисляет и выводит результат: 𝟸 + 𝟹 + 𝟶.𝟻 = 𝟻.𝟻.
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1👎1