Python: задачки и вопросы
رفتن به کانال در Telegram
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media
نمایش بیشتر7 132
مشترکین
-124 ساعت
+77 روز
اطلاعاتی وجود ندارد30 روز
آرشیو پست ها
Перемещение счетчика в общую глобальную область видимости, чтобы сделать возможным его изменение, также означает, что он будет разделяться всеми внутренними функциями. В отличие от атрибутов экземпляров классов глобальные счетчики относятся ко всей программе, а не к каждой функции — счетчик инкрементируется для вызова любой отслеживаемой функции.
Это демонстрирует разницу между использованием глобальных переменных и атрибутов экземпляров классов в декораторах. Глобальная переменная создает общий счетчик для всех декорированных функций, а не отдельный счетчик для каждой функции.
Глобальная переменная 𝚌𝚊𝚕𝚕𝚜 является общей для всех декорированных функций, поэтому счетчик инкрементируется при каждом вызове любой из декорированных функций.
Последовательность выполнения:
🔘 𝚜𝚙𝚊𝚖(𝟷, 𝟸, 𝟹) − 𝚌𝚊𝚕𝚕𝚜 становится 𝟷, выводится «𝚌𝚊𝚕𝚕 𝟷 𝚝𝚘 𝚜𝚙𝚊𝚖», затем 𝟼
🔘 𝚜𝚙𝚊𝚖(𝚊=𝟺, 𝚋=𝟻, 𝚌=𝟼) − 𝚌𝚊𝚕𝚕𝚜 становится 𝟸, выводится «𝚌𝚊𝚕𝚕 𝟸 𝚝𝚘 𝚜𝚙𝚊𝚖», затем 𝟷𝟻
🔘 𝚎𝚐𝚐𝚜(𝟸, 𝟷𝟼) − 𝚌𝚊𝚕𝚕𝚜 становится 𝟹, выводится «𝚌𝚊𝚕𝚕 𝟹 𝚝𝚘 𝚎𝚐𝚐𝚜», затем 𝟼𝟻𝟻𝟹𝟼
🔘 𝚎𝚐𝚐𝚜(𝟺, 𝚢=𝟺) − 𝚌𝚊𝚕𝚕𝚜 становится 𝟺, выводится «𝚌𝚊𝚕𝚕 𝟺 𝚝𝚘 𝚎𝚐𝚐𝚜», затем 𝟸𝟻𝟼
Марк Лутц «Изучаем Python», глава 39:
«Так определяется и применяется декоратор функции, который подсчитывает количество вызовов декорированной функции и для каждого вызова выводит трассировочное сообщение».
Ключевые моменты работы декоратора:
🔘 При декорировании (@𝚝𝚛𝚊𝚌𝚎𝚛) создается экземпляр класса 𝚝𝚛𝚊𝚌𝚎𝚛, который сохраняет исходную функцию 𝚜𝚙𝚊𝚖 в атрибуте 𝚜𝚎𝚕𝚏.𝚏𝚞𝚗𝚌
🔘 Счетчик вызовов 𝚜𝚎𝚕𝚏.𝚌𝚊𝚕𝚕𝚜 инициализируется нулем
🔘 При каждом вызове декорированной функции 𝚜𝚙𝚊𝚖 срабатывает метод __𝚌𝚊𝚕𝚕__ класса 𝚝𝚛𝚊𝚌𝚎𝚛
Как отмечается в учебнике: «При последующих вызовах: запуск исходной функции»
Последовательность выполнения:
🔘 Вызов 𝚜𝚙𝚊𝚖(𝟷, 𝟸, 𝟹) перехватывается декоратором
🔘 Увеличивается счетчик 𝚜𝚎𝚕𝚏.𝚌𝚊𝚕𝚕𝚜 (становится 𝟷)
🔘 Выводится сообщение '𝚌𝚊𝚕𝚕 𝟷 𝚝𝚘 𝚜𝚙𝚊𝚖'
🔘 Вызывается исходная функция 𝚜𝚎𝚕𝚏.𝚏𝚞𝚗𝚌(∗𝚊𝚛𝚐𝚜), которая возвращает 𝟼 (𝟷+𝟸+𝟹)
🔘 Результат 𝟼 присваивается переменной 𝚛𝚎𝚜𝚞𝚕𝚝 и выводится
🔘 Выводится значение 𝚜𝚙𝚊𝚖.𝚌𝚊𝚕𝚕𝚜, которое равно 𝟷
«Обратите внимание, что общее количество вызовов отображается как атрибут декорированной функции».
Важно отметить, что в отличие от оригинального примера из учебника, в данной задаче функция 𝚜𝚙𝚊𝚖 возвращает результат (𝚛𝚎𝚝𝚞𝚛𝚗 𝚊 + 𝚋 + 𝚌), поэтому декоратор также должен возвращать результат вызова исходной функции.
В данной задаче демонстрируется работа декоратора класса, который создает обертку (𝚆𝚛𝚊𝚙𝚙𝚎𝚛) для перехвата доступа к атрибутам экземпляра.
Марк Лутц, «Изучаем Python», глава 𝟹𝟿:
«В приведенном примере декоратор повторно привязывает имя класса к другому классу, который предохраняет исходный класс в объемлющей области видимости и при обращении к исходному классу создает и внедряет его экземпляр. Когда позже из экземпляра извлекается какой−нибудь атрибут, операция перехватывается методом __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ объекта−оболочки и ее выполнение делегируется внедренному экземпляру исходного класса».
Как работает код:
🔘 Декоратор 𝚍𝚎𝚌𝚘𝚛𝚊𝚝𝚘𝚛 принимает класс 𝙲 и возвращает класс 𝚆𝚛𝚊𝚙𝚙𝚎𝚛
🔘 При создании экземпляра 𝚡 = 𝙲(𝟼, 𝟽) фактически создается экземпляр 𝚆𝚛𝚊𝚙𝚙𝚎𝚛
🔘 В конструкторе 𝚆𝚛𝚊𝚙𝚙𝚎𝚛.__𝚒𝚗𝚒𝚝__ создается экземпляр исходного класса 𝙲 и сохраняется в 𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍
🔘 При обращении к атрибуту 𝚡.𝚊𝚝𝚝𝚛 срабатывает метод 𝚆𝚛𝚊𝚙𝚙𝚎𝚛.__𝚐𝚎𝚝𝚊𝚝𝚝𝚛__
🔘 Метод __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ делегирует обращение к атрибуту исходному экземпляру через 𝚐𝚎𝚝𝚊𝚝𝚝𝚛(𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍, 𝚗𝚊𝚖𝚎)
Марк Лутц, «Изучаем Python», глава 39:
«Декораторы функций представляют собой синтаксический сахар, который обеспечивает запуск одной функции через другую в конце оператора 𝚍𝚎𝚏 и повторно привязывает имя исходной функции к результату».
«Автоматическая повторная привязка имен объясняет синтаксис декорирования статических методов и свойств:
𝚌𝚕𝚊𝚜𝚜 С:
@𝚜𝚝𝚊𝚝𝚒𝚌𝚖𝚎𝚝𝚑𝚘𝚍
𝚍𝚎𝚏 𝚖𝚎𝚝𝚑 (...): ... # 𝚖𝚎𝚝𝚑 = 𝚜𝚝𝚊𝚝𝚒𝚌𝚖𝚎𝚝𝚑𝚘𝚍 (𝚖𝚎𝚝𝚑)
В обоих случаях имя метода повторно привязывается к результату встроенного декоратора в конце оператора 𝚍𝚎𝚏».
Свойства исполняют особую роль, в то время как дескрипторы более универсальны. Свойства определяют функции извлечения, установки и удаления для конкретного атрибута; дескрипторы снабжают класс методами для таких действий, но предоставляют добавочную гибкость с целью поддержки более произвольных действий. На самом деле свойства являются простым способом создания специфического вида дескриптора — такого, который запускает функции при доступе к атрибутам. Реализация тоже отличается: свойство создается с помощью встроенной функции, а дескриптор — посредством класса; таким образом, дескрипторы могут воспользоваться в своих интересах всеми обычными возможностями ООП, касающимися классов, вроде наследования. Кроме того, вдобавок к информации состояния экземпляра дескрипторы имеют собственное локальное состояние, так что временами они способны избегать конфликтов имен в экземпляре.
Код демонстрирует работу оператора 𝚍𝚎𝚕 с методом __𝚍𝚎𝚕𝚊𝚝𝚝𝚛__, который автоматически вызывается при удалении атрибутов объекта.
Из документации Python:
«Оператор 𝚍𝚎𝚕 используется для удаления элементов из списков, переменных и атрибутов объектов».
В данном случае:
🔘 При выполнении 𝚍𝚎𝚕 𝚋𝚘𝚋.𝚗𝚊𝚖𝚎 интерпретатор автоматически вызывает метод __𝚍𝚎𝚕𝚊𝚝𝚝𝚛__.
🔘 В параметр 𝚊𝚝𝚝𝚛 передаётся имя атрибута 𝚗𝚊𝚖𝚎.
🔘 Метод выводит '𝚍𝚎𝚕: ' + 𝚊𝚝𝚝𝚛, то есть 𝚍𝚎𝚕: 𝚗𝚊𝚖𝚎.
🔘 Затем проверяется условие 𝚒𝚏 𝚊𝚝𝚝𝚛 == '𝚗𝚊𝚖𝚎' — оно истинно.
🔘 Переменная 𝚊𝚝𝚝𝚛 переназначается на '_𝚗𝚊𝚖𝚎' для работы с внутренним атрибутом.
🔘 Выполняется 𝚍𝚎𝚕 𝚜𝚎𝚕𝚏.__𝚍𝚒𝚌𝚝__[𝚊𝚝𝚝𝚛], что удаляет атрибут _𝚗𝚊𝚖𝚎 из словаря объекта.
Важно понимать, что метод __𝚍𝚎𝚕𝚊𝚝𝚝𝚛__ получает именно то имя атрибута, которое было указано в операторе 𝚍𝚎𝚕, а не внутреннее имя _𝚗𝚊𝚖𝚎. Это позволяет создавать "виртуальные" атрибуты, которые на самом деле управляют другими внутренними атрибутами объекта.
Зацените как похорошели транскрибации при Войси!
Вайб-кодинг вайб-кодингом, но как же не хватает простого человеческого «расшифруй мне созвон, только качественно!!». С этим вам поможет Войси.
🤯Этот ИИ-агент может с легкостью сделать из созвона текст, подвести итоги встречи и составить саммари. Войси переводит с 54 языков на русский без всяких артефактов и составляет текст в аккуратные абзацы с выделенными тезисами.
Самое удобное, что далеко ходить не надо — всё это делается прямо в «телеге». Экономьте своё время, превращая часы в минуты.
🔥А новичкам доступны 1,5 часа бесплатной транскрибации. Забирайте: https://tprg.ru/9xQo
Все способы верные:
pandas.Series.mean():
Метод для Pandas Series, который возвращает арифметическое среднее значений. .
numpy.mean():
Функция np.mean(arr, ...) вычисляет арифметическое среднее массива (или любого array-like объекта). При вводе целых чисел результатом будет вещественный float64.
statistics.mean():
Стандартная библиотека Python: функция mean() вычисляет арифметическое среднее для последовательности чисел (поддерживает int, float, Decimal и др.).
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
