Прохожу сейчас платные курсы (у вас тоже Сергей) , но конкретно учусь на разработчика ВЕБ приложений. В общем хочу сказать, то, что лучше Вас никто еще не объяснял. Лесть - не круто, но это блин так! Это факт, а факт - штука упрямая. Даже я, 41-летний мужчина, начал что-то вспоминать про производные =)
Ох, как же я вам благодарен. Раньше я никак не мог понять как вызывается функция второго уровня вложенности. Оказалось сам интерпретатор так запрограммирован.
Для начинающих объяснять темы на примере синусов и косинусов прям вообще круть👍Вообще,нужно задействовать побольше какой-нибудь высшей математики,тригонометрии и квантовой физики в примерах чтоб легче усваивать было программирование новичкам, ну не тем что физмат окончили, другим новичкам.. А вообще автору спасибо, деньги я за просмотр не платил, а значит и возникать нефиг, в книгах которые покупал просто тоже частенько примеры замороченные, а потом найдешь где-нибудь попроще объяснение и такой, ляяя как так можно такую простую тему так усложнить..
Спасибо, за доступное объяснение трудных тем, я уже отчаялась все это понять, а тут однокурсники порекомендовали ваши курсы. Надежда на то, что все-таки смогу постичь язык ожила).
автор, Вы просто божественен! Так здорово редко объясняет на русскоязычном ютубе! Сделайте пожалуйста курс по паттернам java, если возможно. С большим удовольствием послушаю также
Удивляюсь, тому сколько людей пишет, что им все понятно, круто наверное посмотреть видос и сразу все понять, я 4 раз пересматриваю и пока трудно все связать. Как вы все так быстро разбираетесь?
Я смотрю уже с некоторым опытом разработки пет-проекта, чтобы узнать о пробелах в знаниях и заполнить их. Когда начинал, извращался как мог: гуглил, читал найденные статьи, кодварс, стэковерфлоу - хреновый путь. Лучше сначала пройти весь курс от корки до корки, желательно без пропусков тем, а уже потом делать всё что перечислил. Удачи.
присоединяюсь, всё это хорошо усвоится, если уже есть какой-то опыт, база в голове. На которую можно опереться. Если знания фрагментарные, могут возникнуть сложности. Ну и, конечно, чтоб разобраться, всегда ромогает самому всё это в IDE попробовать, повертеть, посмотреть какое поведение, что от чего зависит.
Сергей хочу просто поблагодарить за ваш труд! Я прошол Ваш курс на степике(отдельный респект курсу) и спустя пол года пересмтриваю многие видео и такой - Вау так тут еще и так можно!))) СПАСИБО!!))
чисто ради интереса вопрос - для сложной темы обязательно было брать пример с синусом, производной и тд? И так сложно, а еще математика 11 класса подъехала...
Увы, не поверю. Такая комбинация клавиш не подходит. Пересмотри внимательно момент. У него курслр на внешней функции, а табнулась вся внутренняя вместо с телом
5:38 цитата: Запрограммированое действие. Кто не знаком тот не поймет почему именно так. Об этом столило подродней или дать ссылку или дать четкое название как это действие называеться. Я с таким сталкивался попробую найти название такой ситуации.
Пара вопросов. 1. Разве не проще использовать стандартный метод декорирования вместо @? То есть def func_decor(func, x): и потом ниже sin_df = func_decor(func, 0.0001). Это же позволит создать несколько вариантов, например для вычисления производной с разной степенью точности и избавит от одного уровня вложенности. 2. Разве не корректнее добавлять описание, что функция вычисляет производную, именно в декоратор? Ведь именно декоратор добавляет функционал вычисления производной, а декорируемая функция вычисляет sin. Разве такой подход не вносит путаницу при чтении кода? Я вижу код который вычисляет синус, но в описании написано, что это производная.
Вот такие две инструкции задают точное описание wrapper. wrapper.__name__ = f'der_{func.__name__}_with_{dx}' wrapper.__doc__ = f'Вычисляет производную {func.__name__} при dx = {dx}' На практике так не делают?
Смотря, что вам нужно. Делают и с функцией и с оператором @. Но чаще вижу @, т.к. это хорошо визуально выделяет декоратор, да и записать проще, чем через функцию (на мой взгляд). Если же одну и ту же функцию нужно декорировать разными декораторами, то да, второй подход через функцию-декоратор.
пока смотрятся как какие-то дикие костыли для непонятных целей все эти телодвижения: [оборачивание в три слоя функций] [чтоб передать параметр декоратору] [маскировка атрибутов обертки через подключенные модули] [чтоб функция не выглядела, будто её обернули в три слоя функций] [не забыть указатель @декоратор над функцией] [чтоб прикрутить всю вышеизложенную громоздкую конструкцию к конкретной функции] но судя по разговором знающих парней, эта тема важная. Поэтому, пока стоит эту дичь тупо вызубрить без особого понимания и ждать, что в дальнейшем процессе обучения или на работе как-то объяснят целесообразность использования декораторов.
Отдельное спасибо за декоратор wraps! Остался только один вопрос. Если нужно использовать и декорированную функцию и исходную функцию без декорирования, как лучше поступить? Приходит только мысль о присвоении исходной функции дополнительного псевдонима через ещё одну переменную.
В этом случае придется применять декоратор не через оператор @, а напрямую, присваивая результат декорации другой переменной. Тогда исходная функция останется без изменений.
@@selfedu_rus добрый день.пишу здесь чтобы вы увидели мой вопрос. Вопрос такой, мы когда обернули наш декоратор в декоратор где у нас параметр dx, после этого параметр х в wrapper же не нужен уже? И в res в вычислениях. Только dx остаётся . Верно ?
Если на 11-ой минуте убрать в 19 строке (dx=0.01), то ошибок не будет, но декоратор не срабатывает Подскажите, пожалуйста, как по невнимательности не попасть в ловушку?
Ребята, которые пишут, что сложно. Не обращайте внимание на сложную формулу производной функции, смотрите только на синтаксис языка и на алгоритм, тогда всё будет очень просто.
Так вычисление производной здесь самое простое во всем видосе. Кстати если вычислять производную по формуле (func(x+dx/2) - func(x-dx/2)) / dx точность вычисления возрастает сразу на несколько порядков 8))
У меня вопрос. Вот вы говорите декораторы не надо вызывать скобками(). Но когда дело доходит до свойств, то приходится декоратор со свойствами именно что вызывать (). Иначе значение по умолчанию не подставляется и возвращается ссылка на функцию. А если мы оставим пустые (), то подставляется значение по умолчанию. Я правильно понимаю? Или что-то не то делаю?
мне кажется кто-то забыл про слово "для начинающих" в названии своего курса?))) не думаю, что "производные от функции" - самый просто и наглядный пример для объяснения работы декораторов, облегчающий понимание темы для любого "начинающего" вайтишника.
Я как человек не помнящий уже что такое синусы и который не понимает что за производные функции ... Короче я вообще не понимаю что мы тут хотим получить и что берём. Это очень плохие примеры... Остальное по программированию понятно. Спасибо) Как сказал один чел на Степике: программисты сумасшедшие люди, я уже тоже близок к сумасшествию, но не к программированию...
df = sin_df(math.pi/3) здесь math.pi/3 - это и есть x Sin_df это же и 0,001 и косинус Я понял что к косинусу мы применяли Pi/3 как аргументы но 0,001 что тут делает мы на него умножаем или что? Заранее спасибо
Спасибо огромное за то что ты всё это делаешь. Всё ясно и понятно объясняешь. Подскажи вроде следуя логики области видимости переменных должно быть следующее: 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: … Ошибку не выдаёт!!! Почему?! В чем разница под капотом?!
Вы, наверное, внутри функции wrapper меняете count, например, count += 1 Как только идет оператор = он создает переменную в текущей области видимости, если ее еще нет (даже если она есть во внешней области), поэтому nonlocal необходим в 1-м случае. Во втором, вы обращаетесь к словарю, но меняете значение его ключа, то есть, новый словарь, естественно, не создается, а значение связывается с нужным ключом словаря. Поэтому при словаре будет работать и без nonlocal. Как то так )
@@selfedu_rus супер я так и думал ! То есть ту очень похожа ситуация на константы объекты в JS которые внутри можно изменять а само имя присвоить чему то другому нет) супер спасибо огромное за канал и быстрый обратный фидбэк!!!) лучший канал в русском сегменте по программированию без преувеличения!!!🤝
3:39 уже не сможем. А до этого что могли? Покрайней мере не показано в видио что в первом варианте можно было прописать параметр в обвертне дикоратора.
ну зачем использовать синусы, производные и другое?? можно же просто x + 2 или x * 2. а то эти синусы и т.д. очень усложняют и отвлекают от понятия декораторов. сидишь и думаешь что он несет???? какие производные? синусы? и чего там еще... результат хочется видеть 2 или 5 или 6, а не 0.1234567890912345678798090123234546658678 всё таки слова учат с букваря, а не с войны и мир.
кстати говоря это бы не сделало понятнее саму тему декораторов. потому что функция то может быть любая внутри. Мне больше не понятно как через декоратор декоратора внутрь попадает и функция и параметр, Сергей просто сказал "это происходит автоматически" , и это ничего не объяснило, на него это не похоже.. обычно разжовывает.
Видимо сам пример не совсем удачный, не понятно зачем всё это нужно. Ведь мы можем просто сделать функцию с двумя параметрами (x, dx) и всё внутри посчитать, передав нужные параметры... т.е. здесь декоратор ничего не даёт.
Но это будет уже другая функция. Смысл в том, что декоратор скрывает в себе некторый полезный функционал, которым мы хотим наделить функцию, поэтому его и прописываем для нее. Декораторы повсеместно используются во Flask, Django, Tensorflow, например.
@@selfedu_rus Да, конечно декораторы полезная вещь. Я только что написал небольшой интернет магазин на Джанго для портфолио :) (спасибо вашим урокам, сейчас пересматриваю, чтобы переосмыслить некоторые вещи) Но, используя фреймворк, ты просто берешь готовый декоратор и всё, не важно как он устроен. Я к тому что для обучения нужен пример, когда декоратор необходим, т.е. более реальный, что-ли, пример.
Уважаемый, Сергей. Не знаю, что заставило Вас так "экономить" на именах (вероятно, существует какое-то тайное соглашение среди программистов об экономии букв), но то, что произошло на 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)
Спасибо каждую тему пишу в заметки своим словами пишу описание каждой картинке За 3 часа разобрал все идеально И всем советую так каждую тему в заметки или в тетрадь Спасибо за урок Есть один вопрос From functool import @Wraps Именно так и нужно ли писать @wraps(func) писать именно над той функцией с которой хочешь сделать описание и имя ?
Талант к преподаванию. Подача материала на высоте. Сергей, спасибо за уроки !!!! Здоровья !!
База
Вы все знаете что такое производная? А примера по проще нельзя было придумать?
Большое вам спасибо, благодаря вашим двум видео про декораторы наконец-то понял их устройство работы, великолепное объяснение
Просто вынос мозга
Прохожу сейчас платные курсы (у вас тоже Сергей) , но конкретно учусь на разработчика ВЕБ приложений. В общем хочу сказать, то, что лучше Вас никто еще не объяснял. Лесть - не круто, но это блин так! Это факт, а факт - штука упрямая. Даже я, 41-летний мужчина, начал что-то вспоминать про производные =)
Лучшее обьяснения темы декораторов
Спасибо. Понял, что надо еще раз просмотреть тему с замыканиями.
Ох, как же я вам благодарен. Раньше я никак не мог понять как вызывается функция второго уровня вложенности. Оказалось сам интерпретатор так запрограммирован.
Для начинающих объяснять темы на примере синусов и косинусов прям вообще круть👍Вообще,нужно задействовать побольше какой-нибудь высшей математики,тригонометрии и квантовой физики в примерах чтоб легче усваивать было программирование новичкам, ну не тем что физмат окончили, другим новичкам..
А вообще автору спасибо, деньги я за просмотр не платил, а значит и возникать нефиг, в книгах которые покупал просто тоже частенько примеры замороченные, а потом найдешь где-нибудь попроще объяснение и такой, ляяя как так можно такую простую тему так усложнить..
Единственный урок который не понял вообще(
Отпуск провожу не зря! Самообразование сила!
Спасибо, за доступное объяснение трудных тем, я уже отчаялась все это понять, а тут однокурсники порекомендовали ваши курсы. Надежда на то, что все-таки смогу постичь язык ожила).
Просто великолепное объяснение! Благодарю, Сергей!
Сергей Вы очень хорошо объясняете. спасибо Вам!
Отличный материал, подробно представленный!
09:10 разве правильно менять приватные переменные?
переменные __name__ - это не приватные, а магические (два последних подчеркивания превращают их в магические)
@@selfedu_rus а если переменная имеет название __value, то она тогда приватная?
@@awwlikда
автор, Вы просто божественен! Так здорово редко объясняет на русскоязычном ютубе! Сделайте пожалуйста курс по паттернам java, если возможно. С большим удовольствием послушаю также
Как всегда респект! Да, эта тема сложная, придётся повторять ещё раз!
Ваш урок - решение моей задачи, благодарю Вас.
огромное спасибо!, очень интрестно и полезно. хотя и довольно сложно по сравнению с начальными уроками)
Удивляюсь, тому сколько людей пишет, что им все понятно, круто наверное посмотреть видос и сразу все понять, я 4 раз пересматриваю и пока трудно все связать. Как вы все так быстро разбираетесь?
с опытом придет...
Бро, я такой же))
Я смотрю уже с некоторым опытом разработки пет-проекта, чтобы узнать о пробелах в знаниях и заполнить их. Когда начинал, извращался как мог: гуглил, читал найденные статьи, кодварс, стэковерфлоу - хреновый путь. Лучше сначала пройти весь курс от корки до корки, желательно без пропусков тем, а уже потом делать всё что перечислил. Удачи.
присоединяюсь, всё это хорошо усвоится, если уже есть какой-то опыт, база в голове. На которую можно опереться. Если знания фрагментарные, могут возникнуть сложности. Ну и, конечно, чтоб разобраться, всегда ромогает самому всё это в IDE попробовать, повертеть, посмотреть какое поведение, что от чего зависит.
Наверно уже не актуально, в общем: ты сам нарисуй схемы взаимодействия кода(со стрелочками как на видео).
И напиши код из видео и повозись с ним.
Спосибо для хорошие объяснения!!
Даже не знаю, что круче - рекурсия или декоратор декоратора )
Спасибо за урок!
Как же ты хорош
Спасибо за материал! Очень интересно!!!
Очень доступно объясняете
Спасибо за урок!!
Сергей хочу просто поблагодарить за ваш труд! Я прошол Ваш курс на степике(отдельный респект курсу) и спустя пол года пересмтриваю многие видео и такой - Вау так тут еще и так можно!))) СПАСИБО!!))
Legend, thanks, you helped me a lot
Сергей отлично преподаёт! Всем рекомендую его курс и отдельное спасибо!
чисто ради интереса вопрос - для сложной темы обязательно было брать пример с синусом, производной и тд? И так сложно, а еще математика 11 класса подъехала...
соглашусь но как пример пойдет
хе
Ага... только начинаешь, что-то понимать.... хрямс! На те синусы! какой-то там dx, который можно регулировать)🤣🤣
камон, вам самим не нужно считать. За вас это сделает калькулятор
4:19 скажи пожалуйста, какими кнопками ты так ловко табулировал внутренние функции, давно ищу это , спасибо!
не поверишь - TAB (или shift+TAB влево если)
Увы, не поверю. Такая комбинация клавиш не подходит. Пересмотри внимательно момент. У него курслр на внешней функции, а табнулась вся внутренняя вместо с телом
@@Insidepointg да, ты прав. Полезная фича. Я тоже не нашел как так делать
не знаю нужно ли это спустя 3 месяца, короче просто выделяешь всё что нужно табулировать и нажимаешь таб, на видео автор просто обрезал этот момент
@@bvkiposs ага, ТАВ работает, как сдвинуть обратно влево? shift+TAB также вправо сдвигает в IDLE
Спасибо!👏👻
Функция для нахождения синуса вычисляет производную через декаратор
аааааааа, ну теперь-то все понятно.
жаль только не понятно все, что после слова "нахождения" и перед "через декоратор")))
Очень хотелось бы увидеть урок с разбором декорирования декораторов
а декораторы оказались не так уж и страшны) главное замыкание функций пройти с Сергеем!
это вообще каеф, если внимательно посмотреть то ничего сложного нет, главное логика и внимательность
спасибо
5:38 цитата: Запрограммированое действие. Кто не знаком тот не поймет почему именно так. Об этом столило подродней или дать ссылку или дать четкое название как это действие называеться. Я с таким сталкивался попробую найти название такой ситуации.
То есть мы превращаем обычную конфету в шоколадку -> добавляем обёртку прослойку, и они все - прозрачные ;-)
Как мне об это не сломать мозг? 😭 Надо работать над собой.
внимательно посмотри, мне помогло, и быстро поймешь и скажешь что изи
Отлично)
Пара вопросов.
1. Разве не проще использовать стандартный метод декорирования вместо @? То есть def func_decor(func, x): и потом ниже sin_df = func_decor(func, 0.0001). Это же позволит создать несколько вариантов, например для вычисления производной с разной степенью точности и избавит от одного уровня вложенности.
2. Разве не корректнее добавлять описание, что функция вычисляет производную, именно в декоратор? Ведь именно декоратор добавляет функционал вычисления производной, а декорируемая функция вычисляет sin. Разве такой подход не вносит путаницу при чтении кода? Я вижу код который вычисляет синус, но в описании написано, что это производная.
Вот такие две инструкции задают точное описание wrapper.
wrapper.__name__ = f'der_{func.__name__}_with_{dx}'
wrapper.__doc__ = f'Вычисляет производную {func.__name__} при dx = {dx}'
На практике так не делают?
Смотря, что вам нужно. Делают и с функцией и с оператором @. Но чаще вижу @, т.к. это хорошо визуально выделяет декоратор, да и записать проще, чем через функцию (на мой взгляд). Если же одну и ту же функцию нужно декорировать разными декораторами, то да, второй подход через функцию-декоратор.
А при декорировании функции, если dx не определить в скобках, то будет выходить ошибка. Как быть? Ведь не всегда нужно, чтобы параметр был определен
в декораторе dx прописан со значением по умолчанию?
пока смотрятся как какие-то дикие костыли для непонятных целей все эти телодвижения:
[оборачивание в три слоя функций]
[чтоб передать параметр декоратору]
[маскировка атрибутов обертки через подключенные модули]
[чтоб функция не выглядела, будто её обернули в три слоя функций]
[не забыть указатель @декоратор над функцией]
[чтоб прикрутить всю вышеизложенную громоздкую конструкцию к конкретной функции]
но судя по разговором знающих парней, эта тема важная. Поэтому, пока стоит эту дичь тупо вызубрить без особого понимания и ждать, что в дальнейшем процессе обучения или на работе как-то объяснят целесообразность использования декораторов.
Спустя год оно тебе понадобилось?)
@triviumfan9411 , не, пока только как упражнение для лучшего понимания 'паттерна декоратор', который тоже пока пригодился только на собесах
Отдельное спасибо за декоратор wraps! Остался только один вопрос. Если нужно использовать и декорированную функцию и исходную функцию без декорирования, как лучше поступить? Приходит только мысль о присвоении исходной функции дополнительного псевдонима через ещё одну переменную.
В этом случае придется применять декоратор не через оператор @, а напрямую, присваивая результат декорации другой переменной. Тогда исходная функция останется без изменений.
@@selfedu_rus так и думал. Спасибо за быстрый ответ!
👍
Здраствуйте, Сергей, какие темы математики надо знать в олимпиадном программировании?
Я как то далек от этой темы, не скажу
@@selfedu_rus добрый день.пишу здесь чтобы вы увидели мой вопрос. Вопрос такой, мы когда обернули наш декоратор в декоратор где у нас параметр dx, после этого параметр х в wrapper же не нужен уже? И в res в вычислениях. Только dx остаётся . Верно ?
@@Taron8117 Мы вызываем декорируемую функцию:
df = sin_df(math.pi/3)
здесь math.pi/3 - это и есть x. Поэтому он нужен.
@@selfedu_rus вроде понял. Спасибо.
Если на 11-ой минуте убрать в 19 строке (dx=0.01), то ошибок не будет, но декоратор не срабатывает
Подскажите, пожалуйста, как по невнимательности не попасть в ловушку?
Не прописывать формальный параметр, т.е. dx без значения по умолчанию
@@selfedu_rus Спасибо большое
👍👍👍👍👍
Почему внутри wrapper не пишем nonlocal func и nonlocal dx ?
Так wrapper не меняет значения func и dx, а всего лишь использует их как локальную ссылку
Ребята, которые пишут, что сложно. Не обращайте внимание на сложную формулу производной функции, смотрите только на синтаксис языка и на алгоритм, тогда всё будет очень просто.
тяжело заставить мозг игнорировать и не пытаться разобраться как работает код между объявлением функции и return-ом, но мы стараемся)))
Так вычисление производной здесь самое простое во всем видосе. Кстати если вычислять производную по формуле (func(x+dx/2) - func(x-dx/2)) / dx точность вычисления возрастает сразу на несколько порядков 8))
Nice))))))
Наверное, самый сложный урок из тех, которые были
Это видео нужно продекорировать лайком
У меня вопрос. Вот вы говорите декораторы не надо вызывать скобками(). Но когда дело доходит до свойств, то приходится декоратор со свойствами именно что вызывать (). Иначе значение по умолчанию не подставляется и возвращается ссылка на функцию. А если мы оставим пустые (), то подставляется значение по умолчанию. Я правильно понимаю? Или что-то не то делаю?
не совсем понял, вам это быстро и подробно в телеграм-канале расскажут )
7:54
мне кажется кто-то забыл про слово "для начинающих" в названии своего курса?)))
не думаю, что "производные от функции" - самый просто и наглядный пример для объяснения работы декораторов, облегчающий понимание темы для любого "начинающего" вайтишника.
Думаешь он сам эти примеры придумывает? Всё давно "спи**жено"
Я как человек не помнящий уже что такое синусы и который не понимает что за производные функции ... Короче я вообще не понимаю что мы тут хотим получить и что берём. Это очень плохие примеры... Остальное по программированию понятно. Спасибо)
Как сказал один чел на Степике: программисты сумасшедшие люди, я уже тоже близок к сумасшествию, но не к программированию...
а синусы не причём, это просто абстрактный пример, речь идёт о декораторах, хотя конечно от этого не легче :D
df = sin_df(math.pi/3)
здесь math.pi/3 - это и есть x
Sin_df это же и 0,001 и косинус
Я понял что к косинусу мы применяли
Pi/3 как аргументы но 0,001 что тут делает мы на него умножаем или что?
Заранее спасибо
сложная тема этот декоратор сразу и не вкатишся
Спасибо огромное за то что ты всё это делаешь. Всё ясно и понятно объясняешь. Подскажи вроде следуя логики области видимости переменных должно быть следующее:
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:
…
Ошибку не выдаёт!!! Почему?! В чем разница под капотом?!
Вы, наверное, внутри функции wrapper меняете count, например, count += 1 Как только идет оператор = он создает переменную в текущей области видимости, если ее еще нет (даже если она есть во внешней области), поэтому nonlocal необходим в 1-м случае. Во втором, вы обращаетесь к словарю, но меняете значение его ключа, то есть, новый словарь, естественно, не создается, а значение связывается с нужным ключом словаря. Поэтому при словаре будет работать и без nonlocal. Как то так )
@@selfedu_rus супер я так и думал ! То есть ту очень похожа ситуация на константы объекты в JS которые внутри можно изменять а само имя присвоить чему то другому нет) супер спасибо огромное за канал и быстрый обратный фидбэк!!!) лучший канал в русском сегменте по программированию без преувеличения!!!🤝
3:39 уже не сможем. А до этого что могли? Покрайней мере не показано в видио что в первом варианте можно было прописать параметр в обвертне дикоратора.
Имеете в виду прописать еще один параметр после первого параметра func? Если так, то это не совсем то.
дикоратор это обёртка делающая функцию более дикой ? :D
тут уже мозги стали плавиться
Сколько вообще видео будет в курсе?
65
Класман!
ну зачем использовать синусы, производные и другое?? можно же просто x + 2 или x * 2. а то эти синусы и т.д. очень усложняют и отвлекают от понятия декораторов. сидишь и думаешь что он несет???? какие производные? синусы? и чего там еще... результат хочется видеть 2 или 5 или 6, а не 0.1234567890912345678798090123234546658678 всё таки слова учат с букваря, а не с войны и мир.
кстати говоря это бы не сделало понятнее саму тему декораторов. потому что функция то может быть любая внутри. Мне больше не понятно как через декоратор декоратора внутрь попадает и функция и параметр, Сергей просто сказал "это происходит автоматически" , и это ничего не объяснило, на него это не похоже.. обычно разжовывает.
Сложнааа...сложнааа
Видимо сам пример не совсем удачный, не понятно зачем всё это нужно.
Ведь мы можем просто сделать функцию с двумя параметрами (x, dx) и всё внутри посчитать, передав нужные параметры... т.е. здесь декоратор ничего не даёт.
Но это будет уже другая функция. Смысл в том, что декоратор скрывает в себе некторый полезный функционал, которым мы хотим наделить функцию, поэтому его и прописываем для нее. Декораторы повсеместно используются во Flask, Django, Tensorflow, например.
@@selfedu_rus Да, конечно декораторы полезная вещь. Я только что написал небольшой интернет магазин на Джанго для портфолио :) (спасибо вашим урокам, сейчас пересматриваю, чтобы переосмыслить некоторые вещи) Но, используя фреймворк, ты просто берешь готовый декоратор и всё, не важно как он устроен.
Я к тому что для обучения нужен пример, когда декоратор необходим, т.е. более реальный, что-ли, пример.
жесть
не ясно как интерпретатор понимает, что в func надо передать sin_df
Слишком запутано и заумно...можно по проще? смотрел кучу видео где про декор об.ясняли на много проще и понятней.
Сразу дизлайк за сложный пример с какими-то синусами, про которые я ничего не помню. Спасибо большое, специально надо было усложнить
Сходу скажу, что перемудрили. Производные, синусы... Мы же не математики тут.
Я не верю, что такие "бутерброды" используются на практике. Это какая-то дичь.
Мда...после такого урока и учить дальше не хочется...нудятина
Уважаемый, Сергей. Не знаю, что заставило Вас так "экономить" на именах (вероятно, существует какое-то тайное соглашение среди программистов об экономии букв), но то, что произошло на 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)
кто-нибудь это читает чтобы сломать себе глаза и мозг?
Спасибо каждую тему пишу в заметки своим словами пишу описание каждой картинке
За 3 часа разобрал все идеально
И всем советую так каждую тему в заметки или в тетрадь
Спасибо за урок
Есть один вопрос
From functool import @Wraps
Именно так и нужно ли писать @wraps(func) писать именно над той функцией с которой хочешь сделать описание и имя ?
Как дела спустя год?
мой мозг вскипел! ни фига не запомнил ((( с этими вложениями просто каша в голове (((
Просто вынос мозга
Путь тяжел. А выше Сергей ещё написал что можно к одной функции много декораторов применить(-_-) Норм. Весело)
спасибо