Обучающий курс: stepik.org/course/100707 Создаем декораторы с параметрами. Пример использования и декорирования функций такими декораторами. Telegram-канал: t.me/python_selfedu
Пікірлер: 120
@86Blind2 жыл бұрын
Талант к преподаванию. Подача материала на высоте. Сергей, спасибо за уроки !!!! Здоровья !!
@hardlabor9412 Жыл бұрын
База
@user-mz1rv4og9nАй бұрын
Ох, как же я вам благодарен. Раньше я никак не мог понять как вызывается функция второго уровня вложенности. Оказалось сам интерпретатор так запрограммирован.
@SpikeSatevis Жыл бұрын
Единственный урок который не понял вообще(
@kelavr89612 ай бұрын
Спасибо за урок!!
@user-rq3ss6vv8w2 жыл бұрын
Просто вынос мозга
@CakesFly2 жыл бұрын
Просто великолепное объяснение! Благодарю, Сергей!
@hxxskyy39754 ай бұрын
Большое вам спасибо, благодаря вашим двум видео про декораторы наконец-то понял их устройство работы, великолепное объяснение
@igorkulibaba72872 жыл бұрын
Сергей Вы очень хорошо объясняете. спасибо Вам!
@donfedor0072 жыл бұрын
Отпуск провожу не зря! Самообразование сила!
@Kappitoshca2 жыл бұрын
Ваш урок - решение моей задачи, благодарю Вас.
@ivanlino37472 жыл бұрын
Спасибо за материал! Очень интересно!!!
@mr.paradox43707 ай бұрын
Отличный материал, подробно представленный!
@ksymbescenny8859 Жыл бұрын
Удивляюсь, тому сколько людей пишет, что им все понятно, круто наверное посмотреть видос и сразу все понять, я 4 раз пересматриваю и пока трудно все связать. Как вы все так быстро разбираетесь?
@gpankov Жыл бұрын
с опытом придет...
@user-eo6bq6yi9l Жыл бұрын
Бро, я такой же))
@VGCor Жыл бұрын
Я смотрю уже с некоторым опытом разработки пет-проекта, чтобы узнать о пробелах в знаниях и заполнить их. Когда начинал, извращался как мог: гуглил, читал найденные статьи, кодварс, стэковерфлоу - хреновый путь. Лучше сначала пройти весь курс от корки до корки, желательно без пропусков тем, а уже потом делать всё что перечислил. Удачи.
@user-tp7uw5cl7n Жыл бұрын
присоединяюсь, всё это хорошо усвоится, если уже есть какой-то опыт, база в голове. На которую можно опереться. Если знания фрагментарные, могут возникнуть сложности. Ну и, конечно, чтоб разобраться, всегда ромогает самому всё это в IDE попробовать, повертеть, посмотреть какое поведение, что от чего зависит.
@alexandr815311 ай бұрын
Наверно уже не актуально, в общем: ты сам нарисуй схемы взаимодействия кода(со стрелочками как на видео). И напиши код из видео и повозись с ним.
@Elena-xq3gc7 ай бұрын
Спасибо, за доступное объяснение трудных тем, я уже отчаялась все это понять, а тут однокурсники порекомендовали ваши курсы. Надежда на то, что все-таки смогу постичь язык ожила).
@tbassir9076 Жыл бұрын
Как всегда респект! Да, эта тема сложная, придётся повторять ещё раз!
@alexandercherkashin351210 ай бұрын
автор, Вы просто божественен! Так здорово редко объясняет на русскоязычном ютубе! Сделайте пожалуйста курс по паттернам java, если возможно. С большим удовольствием послушаю также
@user-qz9xs1kl2t5 ай бұрын
Для начинающих объяснять темы на примере синусов и косинусов прям вообще круть👍Вообще,нужно задействовать побольше какой-нибудь высшей математики,тригонометрии и квантовой физики в примерах чтоб легче усваивать было программирование новичкам, ну не тем что физмат окончили, другим новичкам.. А вообще автору спасибо, деньги я за просмотр не платил, а значит и возникать нефиг, в книгах которые покупал просто тоже частенько примеры замороченные, а потом найдешь где-нибудь попроще объяснение и такой, ляяя как так можно такую простую тему так усложнить..
@user-yo7qq4od2j3 ай бұрын
Прохожу сейчас платные курсы (у вас тоже Сергей) , но конкретно учусь на разработчика ВЕБ приложений. В общем хочу сказать, то, что лучше Вас никто еще не объяснял. Лесть - не круто, но это блин так! Это факт, а факт - штука упрямая. Даже я, 41-летний мужчина, начал что-то вспоминать про производные =)
@iliyanivanov66062 жыл бұрын
Спосибо для хорошие объяснения!!
@andredru42784 ай бұрын
Спасибо. Понял, что надо еще раз просмотреть тему с замыканиями.
@user-qj6tk5fw9p Жыл бұрын
огромное спасибо!, очень интрестно и полезно. хотя и довольно сложно по сравнению с начальными уроками)
@vladimirkulakov61262 жыл бұрын
Сергей отлично преподаёт! Всем рекомендую его курс и отдельное спасибо!
@michailpty63027 ай бұрын
Очень доступно объясняете
@aleksandr_nokhrin Жыл бұрын
Даже не знаю, что круче - рекурсия или декоратор декоратора ) Спасибо за урок!
@mingboevnurullo8 ай бұрын
Legend, thanks, you helped me a lot
@sergeyf74592 жыл бұрын
Отлично)
@Neural.Academy2 жыл бұрын
Как же ты хорош
@leshen_show2 жыл бұрын
чисто ради интереса вопрос - для сложной темы обязательно было брать пример с синусом, производной и тд? И так сложно, а еще математика 11 класса подъехала...
@playt_pythonlearn2 жыл бұрын
соглашусь но как пример пойдет хе
@romanvishnyakov6835 Жыл бұрын
Ага... только начинаешь, что-то понимать.... хрямс! На те синусы! какой-то там dx, который можно регулировать)🤣🤣
@biglakecom10 ай бұрын
камон, вам самим не нужно считать. За вас это сделает калькулятор
@DinLiren Жыл бұрын
Функция для нахождения синуса вычисляет производную через декаратор
@johnmazepa Жыл бұрын
аааааааа, ну теперь-то все понятно. жаль только не понятно все, что после слова "нахождения" и перед "через декоратор")))
@vladdiachenko8529 Жыл бұрын
Сергей хочу просто поблагодарить за ваш труд! Я прошол Ваш курс на степике(отдельный респект курсу) и спустя пол года пересмтриваю многие видео и такой - Вау так тут еще и так можно!))) СПАСИБО!!))
@gayratsaidakhmedov54516 ай бұрын
спасибо
@scorpionevil77782 жыл бұрын
Это тему понял смутно.
@alexanderivlev845810 ай бұрын
Очень хотелось бы увидеть урок с разбором декорирования декораторов
@johnmazepa Жыл бұрын
пока смотрятся как какие-то дикие костыли для непонятных целей все эти телодвижения: [оборачивание в три слоя функций] [чтоб передать параметр декоратору] [маскировка атрибутов обертки через подключенные модули] [чтоб функция не выглядела, будто её обернули в три слоя функций] [не забыть указатель @декоратор над функцией] [чтоб прикрутить всю вышеизложенную громоздкую конструкцию к конкретной функции] но судя по разговором знающих парней, эта тема важная. Поэтому, пока стоит эту дичь тупо вызубрить без особого понимания и ждать, что в дальнейшем процессе обучения или на работе как-то объяснят целесообразность использования декораторов.
@user-ez4ni5ce5d2 жыл бұрын
Как мне об это не сломать мозг? 😭 Надо работать над собой.
@playt_pythonlearn2 жыл бұрын
внимательно посмотри, мне помогло, и быстро поймешь и скажешь что изи
@vladimirkulakov86672 жыл бұрын
а декораторы оказались не так уж и страшны) главное замыкание функций пройти с Сергеем!
@playt_pythonlearn2 жыл бұрын
это вообще каеф, если внимательно посмотреть то ничего сложного нет, главное логика и внимательность
@jamjam3337 Жыл бұрын
Спасибо!👏👻
@palyura11622 жыл бұрын
5:38 цитата: Запрограммированое действие. Кто не знаком тот не поймет почему именно так. Об этом столило подродней или дать ссылку или дать четкое название как это действие называеться. Я с таким сталкивался попробую найти название такой ситуации.
@Keshtiman2 жыл бұрын
Наверное, самый сложный урок из тех, которые были
@Developer_python_ Жыл бұрын
Nice))))))
@VGCor Жыл бұрын
Отдельное спасибо за декоратор wraps! Остался только один вопрос. Если нужно использовать и декорированную функцию и исходную функцию без декорирования, как лучше поступить? Приходит только мысль о присвоении исходной функции дополнительного псевдонима через ещё одну переменную.
@selfedu_rus Жыл бұрын
В этом случае придется применять декоратор не через оператор @, а напрямую, присваивая результат декорации другой переменной. Тогда исходная функция останется без изменений.
@VGCor Жыл бұрын
@@selfedu_rus так и думал. Спасибо за быстрый ответ!
@ibrahimoglu2 жыл бұрын
👍
@impellergimpeller51332 жыл бұрын
👍👍👍👍👍
@skiffsolo94192 жыл бұрын
Пара вопросов. 1. Разве не проще использовать стандартный метод декорирования вместо @? То есть def func_decor(func, x): и потом ниже sin_df = func_decor(func, 0.0001). Это же позволит создать несколько вариантов, например для вычисления производной с разной степенью точности и избавит от одного уровня вложенности. 2. Разве не корректнее добавлять описание, что функция вычисляет производную, именно в декоратор? Ведь именно декоратор добавляет функционал вычисления производной, а декорируемая функция вычисляет sin. Разве такой подход не вносит путаницу при чтении кода? Я вижу код который вычисляет синус, но в описании написано, что это производная.
@skiffsolo94192 жыл бұрын
Вот такие две инструкции задают точное описание wrapper. wrapper.__name__ = f'der_{func.__name__}_with_{dx}' wrapper.__doc__ = f'Вычисляет производную {func.__name__} при dx = {dx}' На практике так не делают?
@selfedu_rus2 жыл бұрын
Смотря, что вам нужно. Делают и с функцией и с оператором @. Но чаще вижу @, т.к. это хорошо визуально выделяет декоратор, да и записать проще, чем через функцию (на мой взгляд). Если же одну и ту же функцию нужно декорировать разными декораторами, то да, второй подход через функцию-декоратор.
@user-zn8mt1wh9r Жыл бұрын
Ребята, которые пишут, что сложно. Не обращайте внимание на сложную формулу производной функции, смотрите только на синтаксис языка и на алгоритм, тогда всё будет очень просто.
@johnmazepa Жыл бұрын
тяжело заставить мозг игнорировать и не пытаться разобраться как работает код между объявлением функции и return-ом, но мы стараемся)))
@eugenedukatta93558 ай бұрын
Так вычисление производной здесь самое простое во всем видосе. Кстати если вычислять производную по формуле (func(x+dx/2) - func(x-dx/2)) / dx точность вычисления возрастает сразу на несколько порядков 8))
@user-gf7fr8qw2e2 жыл бұрын
сложная тема этот декоратор сразу и не вкатишся
@user-ni4sq9td6l2 жыл бұрын
Спасибо огромное за то что ты всё это делаешь. Всё ясно и понятно объясняешь. Подскажи вроде следуя логики области видимости переменных должно быть следующее: def cache(func): cach = {} count = 0 def wrapper(*args, ** kwargs): if count == 3: … Этот код выводит ошибку из виде понятно почему можно починить nonlocal, а вот такое: def cache(func): local = { 'cach': {}, 'count': 0 def wrapper(*args, ** kwargs): if local['count'] == 3: … Ошибку не выдаёт!!! Почему?! В чем разница под капотом?!
@selfedu_rus2 жыл бұрын
Вы, наверное, внутри функции wrapper меняете count, например, count += 1 Как только идет оператор = он создает переменную в текущей области видимости, если ее еще нет (даже если она есть во внешней области), поэтому nonlocal необходим в 1-м случае. Во втором, вы обращаетесь к словарю, но меняете значение его ключа, то есть, новый словарь, естественно, не создается, а значение связывается с нужным ключом словаря. Поэтому при словаре будет работать и без nonlocal. Как то так )
@user-ni4sq9td6l2 жыл бұрын
@@selfedu_rus супер я так и думал ! То есть ту очень похожа ситуация на константы объекты в JS которые внутри можно изменять а само имя присвоить чему то другому нет) супер спасибо огромное за канал и быстрый обратный фидбэк!!!) лучший канал в русском сегменте по программированию без преувеличения!!!🤝
@Insidepointg Жыл бұрын
4:19 скажи пожалуйста, какими кнопками ты так ловко табулировал внутренние функции, давно ищу это , спасибо!
@xev1882 Жыл бұрын
не поверишь - TAB (или shift+TAB влево если)
@Insidepointg Жыл бұрын
Увы, не поверю. Такая комбинация клавиш не подходит. Пересмотри внимательно момент. У него курслр на внешней функции, а табнулась вся внутренняя вместо с телом
@xev1882 Жыл бұрын
@@Insidepointg да, ты прав. Полезная фича. Я тоже не нашел как так делать
@qryak10 ай бұрын
не знаю нужно ли это спустя 3 месяца, короче просто выделяешь всё что нужно табулировать и нажимаешь таб, на видео автор просто обрезал этот момент
@eugenedukatta93558 ай бұрын
@@qryak ага, ТАВ работает, как сдвинуть обратно влево? shift+TAB также вправо сдвигает в IDLE
@ivanbonadykov96242 жыл бұрын
Здраствуйте, Сергей, какие темы математики надо знать в олимпиадном программировании?
@selfedu_rus2 жыл бұрын
Я как то далек от этой темы, не скажу
@Taron8117 Жыл бұрын
@@selfedu_rus добрый день.пишу здесь чтобы вы увидели мой вопрос. Вопрос такой, мы когда обернули наш декоратор в декоратор где у нас параметр dx, после этого параметр х в wrapper же не нужен уже? И в res в вычислениях. Только dx остаётся . Верно ?
@selfedu_rus Жыл бұрын
@@Taron8117 Мы вызываем декорируемую функцию: df = sin_df(math.pi/3) здесь math.pi/3 - это и есть x. Поэтому он нужен.
@Taron8117 Жыл бұрын
@@selfedu_rus вроде понял. Спасибо.
@kakandaville2 жыл бұрын
Класман!
@biglakecom10 ай бұрын
А при декорировании функции, если dx не определить в скобках, то будет выходить ошибка. Как быть? Ведь не всегда нужно, чтобы параметр был определен
@selfedu_rus10 ай бұрын
в декораторе dx прописан со значением по умолчанию?
@user-ji6df1ei2c Жыл бұрын
У меня вопрос. Вот вы говорите декораторы не надо вызывать скобками(). Но когда дело доходит до свойств, то приходится декоратор со свойствами именно что вызывать (). Иначе значение по умолчанию не подставляется и возвращается ссылка на функцию. А если мы оставим пустые (), то подставляется значение по умолчанию. Я правильно понимаю? Или что-то не то делаю?
@selfedu_rus Жыл бұрын
не совсем понял, вам это быстро и подробно в телеграм-канале расскажут )
@vladmaltsev32382 жыл бұрын
Если на 11-ой минуте убрать в 19 строке (dx=0.01), то ошибок не будет, но декоратор не срабатывает Подскажите, пожалуйста, как по невнимательности не попасть в ловушку?
@selfedu_rus2 жыл бұрын
Не прописывать формальный параметр, т.е. dx без значения по умолчанию
@vladmaltsev32382 жыл бұрын
@@selfedu_rus Спасибо большое
@user-fz1yu2qv8f Жыл бұрын
7:54
@johnmazepa Жыл бұрын
мне кажется кто-то забыл про слово "для начинающих" в названии своего курса?))) не думаю, что "производные от функции" - самый просто и наглядный пример для объяснения работы декораторов, облегчающий понимание темы для любого "начинающего" вайтишника.
переменные __name__ - это не приватные, а магические (два последних подчеркивания превращают их в магические)
@awwlik6 ай бұрын
@@selfedu_rus а если переменная имеет название __value, то она тогда приватная?
@selfedu_rus6 ай бұрын
@@awwlikда
@user-yp9ix4wl1m Жыл бұрын
Это видео нужно продекорировать лайком
@als-creator2 жыл бұрын
Сколько вообще видео будет в курсе?
@selfedu_rus2 жыл бұрын
65
@user-ji6df1ei2c Жыл бұрын
Я как человек не помнящий уже что такое синусы и который не понимает что за производные функции ... Короче я вообще не понимаю что мы тут хотим получить и что берём. Это очень плохие примеры... Остальное по программированию понятно. Спасибо) Как сказал один чел на Степике: программисты сумасшедшие люди, я уже тоже близок к сумасшествию, но не к программированию...
@PavelNebo11 ай бұрын
а синусы не причём, это просто абстрактный пример, речь идёт о декораторах, хотя конечно от этого не легче :D
@ney107-iz6xl8 ай бұрын
df = sin_df(math.pi/3) здесь math.pi/3 - это и есть x Sin_df это же и 0,001 и косинус Я понял что к косинусу мы применяли Pi/3 как аргументы но 0,001 что тут делает мы на него умножаем или что? Заранее спасибо
@Octieve_San Жыл бұрын
жесть
@palyura11622 жыл бұрын
3:39 уже не сможем. А до этого что могли? Покрайней мере не показано в видио что в первом варианте можно было прописать параметр в обвертне дикоратора.
@selfedu_rus2 жыл бұрын
Имеете в виду прописать еще один параметр после первого параметра func? Если так, то это не совсем то.
@PavelNebo11 ай бұрын
дикоратор это обёртка делающая функцию более дикой ? :D
@xev1882 Жыл бұрын
не ясно как интерпретатор понимает, что в func надо передать sin_df
@user-zy5jq3xu8y Жыл бұрын
ну зачем использовать синусы, производные и другое?? можно же просто x + 2 или x * 2. а то эти синусы и т.д. очень усложняют и отвлекают от понятия декораторов. сидишь и думаешь что он несет???? какие производные? синусы? и чего там еще... результат хочется видеть 2 или 5 или 6, а не 0.1234567890912345678798090123234546658678 всё таки слова учат с букваря, а не с войны и мир.
@PavelNebo11 ай бұрын
кстати говоря это бы не сделало понятнее саму тему декораторов. потому что функция то может быть любая внутри. Мне больше не понятно как через декоратор декоратора внутрь попадает и функция и параметр, Сергей просто сказал "это происходит автоматически" , и это ничего не объяснило, на него это не похоже.. обычно разжовывает.
@DarkRootChannel Жыл бұрын
Сразу дизлайк за сложный пример с какими-то синусами, про которые я ничего не помню. Спасибо большое, специально надо было усложнить
@torri11 Жыл бұрын
Слишком запутано и заумно...можно по проще? смотрел кучу видео где про декор об.ясняли на много проще и понятней.
@Dicerec56Ай бұрын
Мда...после такого урока и учить дальше не хочется...нудятина
@ney107-iz6xl8 ай бұрын
Спасибо каждую тему пишу в заметки своим словами пишу описание каждой картинке За 3 часа разобрал все идеально И всем советую так каждую тему в заметки или в тетрадь Спасибо за урок Есть один вопрос From functool import @Wraps Именно так и нужно ли писать @wraps(func) писать именно над той функцией с которой хочешь сделать описание и имя ?
@M21645322 жыл бұрын
Уважаемый, Сергей. Не знаю, что заставило Вас так "экономить" на именах (вероятно, существует какое-то тайное соглашение среди программистов об экономии букв), но то, что произошло на 6:40 видео явно не сделало объяснение проще. Пришлось повозиться с этим моментом, чтобы понять как, но так и не понять зачем... Поэтому позволю себе некоторый комментарий к Вашему коду: def sin_df(x): #здесь мы оределяем функцию с именем sin_df return math.sin(x) f = df_decorator(dx=0.001) # вызываем функцию df_decorator с параметром dx # Эта функция возвращает func_decorator (функцию) мы присваиваем имени f ссылку # на эту функцию. Соответственно f теперь имя для вызываемой функции. print(f.__name__) # используйте эту строчку, чтобы увидеть на что ссылается имя f sin_df = f(sin_df) # вызываем func_decorator через имя f и передаем sin_df в # качестве требуемого параметра func. Функция возвращает wrapper (функцию) и мы # присваиваем ссылку на нее имени (ВНИМАНИЕ!) sin_df. До этого момента sin_df было # определено как имя другой функции, которую мы декорируем. print(sin_df.__name__) # используйте эту строчку, чтобы увидеть на что ссылается имя sin_df df = sin_df(math.pi / 3) # вызываем функцию wrapper по имени sin_df, которой # передаем обязательный параметр x. И ссылку на результат присваиваем имени df. print(df)
@eugenedukatta93558 ай бұрын
кто-нибудь это читает чтобы сломать себе глаза и мозг?
@s0042 Жыл бұрын
мой мозг вскипел! ни фига не запомнил ((( с этими вложениями просто каша в голове (((
@PavelNebo11 ай бұрын
Видимо сам пример не совсем удачный, не понятно зачем всё это нужно. Ведь мы можем просто сделать функцию с двумя параметрами (x, dx) и всё внутри посчитать, передав нужные параметры... т.е. здесь декоратор ничего не даёт.
@selfedu_rus11 ай бұрын
Но это будет уже другая функция. Смысл в том, что декоратор скрывает в себе некторый полезный функционал, которым мы хотим наделить функцию, поэтому его и прописываем для нее. Декораторы повсеместно используются во Flask, Django, Tensorflow, например.
@PavelNebo11 ай бұрын
@@selfedu_rus Да, конечно декораторы полезная вещь. Я только что написал небольшой интернет магазин на Джанго для портфолио :) (спасибо вашим урокам, сейчас пересматриваю, чтобы переосмыслить некоторые вещи) Но, используя фреймворк, ты просто берешь готовый декоратор и всё, не важно как он устроен. Я к тому что для обучения нужен пример, когда декоратор необходим, т.е. более реальный, что-ли, пример.
@user-rq3ss6vv8w2 жыл бұрын
Просто вынос мозга
@fuck_off_2 жыл бұрын
Путь тяжел. А выше Сергей ещё написал что можно к одной функции много декораторов применить(-_-) Норм. Весело)