🫵 Теория без практики - ничто, поэтому 👇 🐍 stepik.org/course/63085/promo 👉 специально для тебя создал бесплатный топовый курс по Python 👉 В нем тебя ждет: 📗 более 400 практических заданий на программирование 📗 более 250 тестовых заданий на проверку материала 📗 десятки часов видеоматерилов по теории 📗 видеоразборы решения заданий 📗 текстовые материалы по урокам, примеры кода 📗 доступ к закрытому чату с дружественной обстановкой 📗 сертификат в случае успешного прохождения курса
@EscanorTime4 жыл бұрын
это имелось в виду под "время между соседними вызовами?" def timer(): start = perf_counter() def inner(): nonlocal start result = perf_counter() - start start = perf_counter() return result return inner
@ЕрвандАгаджанян-в3к3 жыл бұрын
Спасибо! Шикарный и очень подробный разбор темы замыканий)
@АлексейЕгоров-к9е Жыл бұрын
Круто. хорошие 2 урока. помогли мне лучше понять решения некоторых задач. Можно для разнообразия было показать counter(mult)(12, 3, 4), что и так можно записать, а то бывают такие задачки. найти сумму чисел ch_sum(10)(20)(30)() или умножение 7*5 в виде функций print(seven(time(five()))).
@galinaoliver5624 Жыл бұрын
Насколько же крутой материал!!!! Благодарю
@slavaseredenko48462 жыл бұрын
Спасибо, мне очень помогло. Чудесный пример кеша в декораторах
@ananasanimator6049 Жыл бұрын
from time import perf_counter def timer(): start = perf_counter() def f(): nonlocal start print(perf_counter() - start) start = perf_counter() return f
@Dmitrii-Zhinzhilov2 жыл бұрын
Артём, благодарю!!! 🔥🔥🔥🔥
@АнастасияСитко-х9ю2 жыл бұрын
Самый лучший канал!
@LukasFeinberg Жыл бұрын
4:00 читать переменные из области выше можно, а чтобы именно изменить их нужно дать к ним доступ с помощью nonlocal
@2173045 Жыл бұрын
спасибо , тоже об этом подумал
@finishae2 жыл бұрын
Ничеге не понимаю, но рад за тебя крутыш) Молодец!
@egorpython96834 жыл бұрын
from time import perf_counter def timer (): start = perf_counter() t=0 summ=0 def inner (): nonlocal summ nonlocal t t=perf_counter()-start-summ summ=summ+t return t return inner
@ВездеПреуспел Жыл бұрын
Артём, привет. В первой части в первом примере мы выводили текст, при команде d() текс выводился. Начиная с counter'a (и всех последующих примерах где были цифры) при команде d() вывод пустой. работает только так: print(d()). Как решить эту проблему?
@НиколайМануилов-и1д3 жыл бұрын
Вроде теперь всё чстало более менее понятно, но вот последний пример для меня до сих пор сложен в понимании
Почему в 1 части на 2:49 мы не объявили во вложенной функции name и не писали nonlocal и это работало. А в этом видео на 3:56 надо писать nonlocal для sum? Такая же история в этом видео на 5:53 с переменной start. Она не требует nonlocal почему?
@vitalykargin Жыл бұрын
Сам себе отвечаю Операторы global и nonlocal используются в области видимости той функции, где будет требуется изменение переменной;
@НиколайМануилов-и1д3 жыл бұрын
Не очень уверен в своем решении, но вроде бы по крайней мере должно быть близко к правде from time import perf_counter def timer(): a1=perf_counter() def inner(): a2=perf_counter() nonlocal a1 z=a2-a1 a1=a2 return z return inner
@egoroffchannel3 жыл бұрын
а какое задание делаешь? напомни плиз
@НиколайМануилов-и1д3 жыл бұрын
@@egoroffchannel ну по видео дз - что бы счетчик показывал время между двумя ближайшими вызывами функции
@Larriva666 Жыл бұрын
Привет! А что вы за IDE используете?
@gorin1337 Жыл бұрын
это pycharm
@zingmao4 жыл бұрын
А будут ли видео по обработке исключений?
@egoroffchannel4 жыл бұрын
да, конечно
@pentium_dynamo-machine Жыл бұрын
почему в первом примере при использовании списка во внутренней функции не пишется nonlocal? Эта переменная же не описана во внутренней функции и нам надо указать, что она взята из вне и при этом список тоже изменяется, как и переменные summa и count далее
@БлезПаскаль-э6р Жыл бұрын
Nonlocal используется для изменения переменной, а не для чтения
@Dennis_Ritchie Жыл бұрын
список - изменяемый объект число - неизменяемый объект
@sharpd11734 жыл бұрын
Спасибо. Будут ли уроки по фреймвокам? Типа Flask,django,PyQt
@egoroffchannel4 жыл бұрын
по джанго точно планируются
@PRO-pt6ew4 жыл бұрын
@@egoroffchannel Было бы круто!
@NikitKiselevchannel Жыл бұрын
а почему при numbers.append мы не объявляли nonlocal numbers? ведь метод списка изменяет исходный список, или как тут логика работает?
@KnightOfSoad Жыл бұрын
Список является изменяемым типом данных (mutable), это означает что он сохраняет единую ссылку на объект списка. А переменные из видео count и sum содержат тип данных integer, который является неизменяемым типом (immutable) - изменять значений переменной данного типа означает менять ссылку на объект (0 имеет одну ссылку, 1 имеет другую, 2 имеет другую и тд). Проверить это можно через встроенную функцию id(arg): у каждого числа будет свой id, в то время как создав список, сколько бы данных в него не залезло, он сохранит свой изначальный id. Другими словами count += 1 это каждый раз создание нового объекта integer, а list.append(number) это обновление существующего объекта списка - это и составляет основу такого разного поведения этих типов данных в замыкании. Использование ...nonlocal x... как бы говорит "я беру переменную 'x' из области видимости уровнем ниже, чтобы у меня была возможность переприсвоить ее"
@margaritawin-win89763 ай бұрын
до изучения ооп: -это что за бубуйня?? после изучения ооп: -да изи вообще
@sallastanec5851 Жыл бұрын
from time import perf_counter def first(): start = perf_counter() listo = [] def second(): tun = perf_counter() - start listo.append(tun) for i in range(len(listo)-1): res = (listo[i+1] - listo[i]) print(res) return second q = first() q()
@VyacheslavOrlov-u2e3 жыл бұрын
Тяжело заходит тема замыканий, пересматриваю ее уже после декораторов from time import perf_counter def timer(): start = perf_counter() def inner(): nonlocal start print(perf_counter() - start) start = perf_counter() return inner
@НиколайМануилов-и1д3 жыл бұрын
С декоработами уже проще воспринимать?
@lera68014 жыл бұрын
А почему когда мы использовали переменную numbers, то не приходилось объявлять nonlocal, он ведь тоже изменяется
@egoroffchannel4 жыл бұрын
Можно было написать, от этого ничего бы не изменилось Я не писал, потому что списки являются изменяемыми объектами. И то что, мы с ними делаем в функции будет видно и вне функции
А есть какой-то практический пример использования замыканий?
@PRO-pt6ew4 жыл бұрын
Видимо, в декораторах
@ЕрвандАгаджанян-в3к3 жыл бұрын
Декораторы работают на основе замыканий.
@АлексейМельников-л3п3 жыл бұрын
спасибо за полезное видео. -_-
@АлексейА-г8ы10 ай бұрын
А почему списку во вложенной функции так же не приписывался нонлокал? По той же аналогии что и summa и count
@СветланаФайнштейн8 ай бұрын
Числа - неизменяемый тип, поэтому перед присвоением значений переменные summa и count описываются как nonlocal. Список - изменяемый тип, для него можно вызывать его методы, здесь - метод append/. Но вот если бы вы во внутренней функции присвоили списку какое-то значение, например, пустой список - пришлось бы так же предварительно объявлять его как nonlocal.
@alexsmth89253 жыл бұрын
Скажите, почему когда обращались к массиву из функции inner(), то его не объявляли как nonlocal, а когда к переменной обращались, то ее объявляли nonlocal?
@egoroffchannel3 жыл бұрын
список потому является изменяемым объектом, поэтому я могу к нему обращаться из другой области видимости и ИЗМЕНЯТЬ
@ruselwow4 жыл бұрын
def func1(): count = 0 def func2(): nonlocal count print(count) count += 1 return func2 a = func1() a() a() a() a() В Переменную а присваивается результат работы функции func1, то есть func2 И когда я пишу а(), я по сути вызываю функцию 1 и после этого вызываю func2, т.е. функция 1 возвращает функцию 2 Теперь вопрос: Почему переменная count не обнуляется при повторном вызове а()? Ведь после завершения работы функции ее переменные должны стираться из памяти
@egoroffchannel4 жыл бұрын
в этом и смысл замыкания. функция 1 возвращает не только функцию 2 но и связанную с ней переменную
@АлексейЕгоров-к9е Жыл бұрын
я тож не понял это. думал раз она явно объявляется 0, то при повторном вызове тоже обязана быть нулем. думаю это надо просто запомнить, понять не возможно!!! )))) эти замыкания как женщины. вроде всё нормально работает, но ни фига не понятно )
@Dm-if3vl4 жыл бұрын
Спасибо
@bulik13843 жыл бұрын
интересно почему в первом примере не нужно прописывать nonlocal numbers, ведь мы добавляем числа в numbers, а значит изменяем его
@egoroffchannel3 жыл бұрын
потому что список - это изменяемый объект, в локальной области не найдется эта переменная, питон пойдет ее искать в след области видимости и там уже по имени переменной мы изменим список
@bulik13843 жыл бұрын
@@egoroffchannel спасибо
@irinabaranovskaya60253 жыл бұрын
здравствуйте! мне иногда не очень понятна разница между вызовом return и print во внутренней функции, например, в первом примере: def average(): #поиск среднего all = [] def inneer_fun(a): all.append(a) print(sum(all)/len(all)) print(all) return inneer_fun
@egoroffchannel3 жыл бұрын
не понял вопроса
@fl4mescare Жыл бұрын
посмотри лучше видео про функции ещё разок) они могут возвращать значения, а могут печатать что-либо при их вызове.. лучше пересмотри, думаю станет ясно
@oksanabogza77284 жыл бұрын
А где найти тему "декоратор"?
@egoroffchannel4 жыл бұрын
она только появится на этой недели
@bulik13843 жыл бұрын
там точно речь о секундах? код срабатывает мгновенно, но ответ в консоли 8-10 сек
@ВячеславВоронин-т3о3 жыл бұрын
Обьяните в чем разница между отсутствием скобок ()и их налмчием в return inner в чем их вобще смысел если поставить ошибку пишет . Реально не ясно что возвращает return inner() и и что вернет return inner в чем смысел скобок каке действие они создают
@deniskrepak3 жыл бұрын
inner со скобками вызывает функцию, а return inner просто возвращает функцию, не вызывая её.
@samirahuseynli69563 жыл бұрын
Почему «start» не nonlocal?
@egoroffchannel3 жыл бұрын
мы его не изменяем, и найти это имя питон может без nonlocal
# Программа считает время между вызовами "экзмпляров" функции from time import perf_counter def mainq(): start = perf_counter() def inner(): nonlocal start u = perf_counter() - start start = perf_counter() return u return inner
@Mcmern3 жыл бұрын
Привет, классные уроки.👍. Вопрос по последнему примеру. Почему если я вызываю функцию func(*args,**kwargs) без return, то код не работает так же, как если бы я написал "return func(*args,**kwargs)" ? def add(a,b): return a+b def counter(func): count = 0 def inner(*args,**kwargs): nonlocal count count += 1 print(f'Функция {func.__name__} вызывалась {count} раз') func(*args,**kwargs) Вот в этой строке return inner
@egoroffchannel3 жыл бұрын
сама функция func вызывется, но так как в inner нету слова return то он вернет None
@Mcmern3 жыл бұрын
@@egoroffchannel спасибо
@nto25034 жыл бұрын
И как найти время между двумя соседними вызовами?
@deniskrepak3 жыл бұрын
Так легко ведь. Переменную старт в функции inner просто меняете и все.
@mefodymo74564 жыл бұрын
Сложно
@lexalexa84873 жыл бұрын
1
@alexanderselesnev37394 жыл бұрын
Решение: from datetime import date from time import perf_counter def timer(): start = perf_counter() def inner(): nonlocal start return perf_counter() - start return inner a1 = timer() print(a1()) Как-то так?
@egoroffchannel4 жыл бұрын
начало замера вызова декорируемой функции не в том месте
@alexanderselesnev37394 жыл бұрын
from datetime import datetime from time import perf_counter def timer(): a = [0] def inner(): start_inner = perf_counter() nonlocal a a.append(start_inner) if len(a) >= 3: del a[:-2] return a[-1] - a[-2] zapusk = timer() zapusk() Или я что-то не понимаю?