ch
Feedback
Python: задачки и вопросы

Python: задачки и вопросы

前往频道在 Telegram

Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media

显示更多
6 961
订阅者
-124 小时
-67
-5630
帖子存档
Борис Пасхавер, «Pandas в действии», глава 𝟹: «Параметр 𝚙𝚊𝚛𝚜𝚎_𝚍𝚊𝚝𝚎𝚜 функции 𝚛𝚎𝚊𝚍_𝚌𝚜𝚟 позволяет задать список строковых значений, отмечающих столбцы, текстовые значения из которых 𝚙𝚊𝚗𝚍𝚊𝚜 должна преобразовать в метки даты / времени. В следующем примере в него передается список, содержащий значения "𝙳𝚊𝚝𝚎":» 𝚙𝚍.𝚛𝚎𝚊𝚍_𝚌𝚜𝚟("𝚐𝚘𝚘𝚐𝚕𝚎_𝚜𝚝𝚘𝚌𝚔𝚜.𝚌𝚜𝚟", 𝚙𝚊𝚛𝚜𝚎_𝚍𝚊𝚝𝚎𝚜 = ["𝙳𝚊𝚝𝚎"]).𝚑𝚎𝚊𝚍() Вот разница между чтением файла без параметра 𝚙𝚊𝚛𝚜𝚎_𝚍𝚊𝚝𝚎𝚜 и с ним: 𝟷. БЕЗ 𝚙𝚊𝚛𝚜𝚎_𝚍𝚊𝚝𝚎𝚜: столбец 𝙳𝚊𝚝𝚎 остается строковым (𝚘𝚋𝚓𝚎𝚌𝚝), значения имеют тип 𝚜𝚝𝚛 𝟸. С 𝚙𝚊𝚛𝚜𝚎_𝚍𝚊𝚝𝚎𝚜=["𝙳𝚊𝚝𝚎"]: столбец 𝙳𝚊𝚝𝚎 преобразуется в 𝚍𝚊𝚝𝚎𝚝𝚒𝚖𝚎𝟼𝟺, значения имеют тип 𝚃𝚒𝚖𝚎𝚜𝚝𝚊𝚖𝚙 Параметр 𝚙𝚊𝚛𝚜𝚎_𝚍𝚊𝚝𝚎𝚜 принимает: − Список имен столбцов для преобразования в даты − 𝚃𝚛𝚞𝚎 для автоматического определения столбцов с датами − Словарь для более сложных преобразований

🧩 Как вынудить Pandas интерпретировать столбец как дату?
Anonymous voting

Марк Лутц «Изучаем Python», глава 𝟹𝟿: «Корень проблемы здесь кроется в аргументе 𝚜𝚎𝚕𝚏 метода __𝚌𝚊𝚕𝚕__ класса 𝚝𝚛𝚊𝚌𝚎𝚛 — он является экземпляром 𝚝𝚛𝚊𝚌𝚎𝚛 или же экземпляром 𝙿𝚎𝚛𝚜𝚘𝚗? На самом деле нам необходимы в коде оба экземпляра: экземпляр 𝚝𝚛𝚊𝚌𝚎𝚛 для состояния декоратора и экземпляр 𝙿𝚎𝚛𝚜𝚘𝚗 для перенаправления на исходный метод. В действительности 𝚜𝚎𝚕𝚏 обязан быть объектом 𝚝𝚛𝚊𝚌𝚎𝚛, чтобы предоставить доступ к информации состояния 𝚝𝚛𝚊𝚌𝚎𝚛 (его атрибутам 𝚌𝚊𝚕𝚕𝚜 и 𝚏𝚞𝚗𝚌); это справедливо для декорирования как простой функции, так и метода». «К сожалению, когда имя декорированного метода повторно привязывается к объекту экземпляра класса с помощью __𝚌𝚊𝚕𝚕__, интерпретатор 𝙿𝚢𝚝𝚑𝚘𝚗 передает в 𝚜𝚎𝚕𝚏 только экземпляр 𝚝𝚛𝚊𝚌𝚎𝚛; он вообще не передает экземпляр 𝙿𝚎𝚛𝚜𝚘𝚗 в списке аргументов. Кроме того, поскольку экземпляру 𝚝𝚛𝚊𝚌𝚎𝚛 ничего не известно об экземпляре 𝙿𝚎𝚛𝚜𝚘𝚗, который мы пытаемся обработать посредством вызовов методов, создать связанный метод с экземпляром не удастся, следовательно, нет способа для корректного координирования вызова». «В итоге предыдущий код передает декорированному методу слишком мало аргументов, что приводит к ошибке».

🪤 Что выведет код?
Anonymous voting

Перемещение счетчика в общую глобальную область видимости, чтобы сделать возможным его изменение, также означает, что он будет разделяться всеми внутренними функциями. В отличие от атрибутов экземпляров классов глобальные счетчики относятся ко всей программе, а не к каждой функции — счетчик инкрементируется для вызова любой отслеживаемой функции. Это демонстрирует разницу между использованием глобальных переменных и атрибутов экземпляров классов в декораторах. Глобальная переменная создает общий счетчик для всех декорированных функций, а не отдельный счетчик для каждой функции. Глобальная переменная 𝚌𝚊𝚕𝚕𝚜 является общей для всех декорированных функций, поэтому счетчик инкрементируется при каждом вызове любой из декорированных функций. Последовательность выполнения: 🔘 𝚜𝚙𝚊𝚖(𝟷, 𝟸, 𝟹) − 𝚌𝚊𝚕𝚕𝚜 становится 𝟷, выводится «𝚌𝚊𝚕𝚕 𝟷 𝚝𝚘 𝚜𝚙𝚊𝚖», затем 𝟼 🔘 𝚜𝚙𝚊𝚖(𝚊=𝟺, 𝚋=𝟻, 𝚌=𝟼) − 𝚌𝚊𝚕𝚕𝚜 становится 𝟸, выводится «𝚌𝚊𝚕𝚕 𝟸 𝚝𝚘 𝚜𝚙𝚊𝚖», затем 𝟷𝟻 🔘 𝚎𝚐𝚐𝚜(𝟸, 𝟷𝟼) − 𝚌𝚊𝚕𝚕𝚜 становится 𝟹, выводится «𝚌𝚊𝚕𝚕 𝟹 𝚝𝚘 𝚎𝚐𝚐𝚜», затем 𝟼𝟻𝟻𝟹𝟼 🔘 𝚎𝚐𝚐𝚜(𝟺, 𝚢=𝟺) − 𝚌𝚊𝚕𝚕𝚜 становится 𝟺, выводится «𝚌𝚊𝚕𝚕 𝟺 𝚝𝚘 𝚎𝚐𝚐𝚜», затем 𝟸𝟻𝟼

🧩 Что выведет код?
Anonymous voting

Марк Лутц «Изучаем Python», глава 39: «Так определяется и применяется декоратор функции, который подсчитывает количество вызовов декорированной функции и для каждого вызова выводит трассировочное сообщение». Ключевые моменты работы декоратора: 🔘 При декорировании (@𝚝𝚛𝚊𝚌𝚎𝚛) создается экземпляр класса 𝚝𝚛𝚊𝚌𝚎𝚛, который сохраняет исходную функцию 𝚜𝚙𝚊𝚖 в атрибуте 𝚜𝚎𝚕𝚏.𝚏𝚞𝚗𝚌 🔘 Счетчик вызовов 𝚜𝚎𝚕𝚏.𝚌𝚊𝚕𝚕𝚜 инициализируется нулем 🔘 При каждом вызове декорированной функции 𝚜𝚙𝚊𝚖 срабатывает метод __𝚌𝚊𝚕𝚕__ класса 𝚝𝚛𝚊𝚌𝚎𝚛 Как отмечается в учебнике: «При последующих вызовах: запуск исходной функции» Последовательность выполнения: 🔘 Вызов 𝚜𝚙𝚊𝚖(𝟷, 𝟸, 𝟹) перехватывается декоратором 🔘 Увеличивается счетчик 𝚜𝚎𝚕𝚏.𝚌𝚊𝚕𝚕𝚜 (становится 𝟷) 🔘 Выводится сообщение '𝚌𝚊𝚕𝚕 𝟷 𝚝𝚘 𝚜𝚙𝚊𝚖' 🔘 Вызывается исходная функция 𝚜𝚎𝚕𝚏.𝚏𝚞𝚗𝚌(∗𝚊𝚛𝚐𝚜), которая возвращает 𝟼 (𝟷+𝟸+𝟹) 🔘 Результат 𝟼 присваивается переменной 𝚛𝚎𝚜𝚞𝚕𝚝 и выводится 🔘 Выводится значение 𝚜𝚙𝚊𝚖.𝚌𝚊𝚕𝚕𝚜, которое равно 𝟷 «Обратите внимание, что общее количество вызовов отображается как атрибут декорированной функции». Важно отметить, что в отличие от оригинального примера из учебника, в данной задаче функция 𝚜𝚙𝚊𝚖 возвращает результат (𝚛𝚎𝚝𝚞𝚛𝚗 𝚊 + 𝚋 + 𝚌), поэтому декоратор также должен возвращать результат вызова исходной функции.

🧩 Что выведет код?
Anonymous voting

В данной задаче демонстрируется работа декоратора класса, который создает обертку (𝚆𝚛𝚊𝚙𝚙𝚎𝚛) для перехвата доступа к атрибутам экземпляра. Марк Лутц, «Изучаем Python», глава 𝟹𝟿: «В приведенном примере декоратор повторно привязывает имя класса к другому классу, который предохраняет исходный класс в объемлющей области видимости и при обращении к исходному классу создает и внедряет его экземпляр. Когда позже из экземпляра извлекается какой−нибудь атрибут, операция перехватывается методом __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ объекта−оболочки и ее выполнение делегируется внедренному экземпляру исходного класса». Как работает код: 🔘 Декоратор 𝚍𝚎𝚌𝚘𝚛𝚊𝚝𝚘𝚛 принимает класс 𝙲 и возвращает класс 𝚆𝚛𝚊𝚙𝚙𝚎𝚛 🔘 При создании экземпляра 𝚡 = 𝙲(𝟼, 𝟽) фактически создается экземпляр 𝚆𝚛𝚊𝚙𝚙𝚎𝚛 🔘 В конструкторе 𝚆𝚛𝚊𝚙𝚙𝚎𝚛.__𝚒𝚗𝚒𝚝__ создается экземпляр исходного класса 𝙲 и сохраняется в 𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍 🔘 При обращении к атрибуту 𝚡.𝚊𝚝𝚝𝚛 срабатывает метод 𝚆𝚛𝚊𝚙𝚙𝚎𝚛.__𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ 🔘 Метод __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ делегирует обращение к атрибуту исходному экземпляру через 𝚐𝚎𝚝𝚊𝚝𝚝𝚛(𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍, 𝚗𝚊𝚖𝚎)

Марк Лутц, «Изучаем Python», глава 39: «Декораторы функций представляют собой синтаксический сахар, который обеспечивает запуск одной функции через другую в конце оператора 𝚍𝚎𝚏 и повторно привязывает имя исходной функции к результату». «Автоматическая повторная привязка имен объясняет синтаксис декорирования статических методов и свойств: 𝚌𝚕𝚊𝚜𝚜 С: @𝚜𝚝𝚊𝚝𝚒𝚌𝚖𝚎𝚝𝚑𝚘𝚍 𝚍𝚎𝚏 𝚖𝚎𝚝𝚑 (...): ... # 𝚖𝚎𝚝𝚑 = 𝚜𝚝𝚊𝚝𝚒𝚌𝚖𝚎𝚝𝚑𝚘𝚍 (𝚖𝚎𝚝𝚑) В обоих случаях имя метода повторно привязывается к результату встроенного декоратора в конце оператора 𝚍𝚎𝚏».

🧩 Что выведет код?
Anonymous voting

Какое утверждение про декораторы верно?
Anonymous voting

Свойства исполняют особую роль, в то время как дескрипторы более универсальны. Свойства определяют функции извлечения, установки и удаления для конкретного атрибута; дескрипторы снабжают класс методами для таких действий, но предоставляют добавочную гибкость с целью поддержки более произвольных действий. На самом деле свойства являются простым способом создания специфического вида дескриптора — такого, который запускает функции при доступе к атрибутам. Реализация тоже отличается: свойство создается с помощью встроенной функции, а дескриптор — посредством класса; таким образом, дескрипторы могут воспользоваться в своих интересах всеми обычными возможностями ООП, касающимися классов, вроде наследования. Кроме того, вдобавок к информации состояния экземпляра дескрипторы имеют собственное локальное состояние, так что временами они способны избегать конфликтов имен в экземпляре.

Чем между собой отличаются свойства и дескрипторы
Anonymous voting