Замыкания в Python Часть 2. Closure Python part 2

  Рет қаралды 33,171

egoroff_channel

egoroff_channel

Күн бұрын

Пікірлер: 78
@egoroffchannel
@egoroffchannel 5 ай бұрын
🫵 Теория без практики - ничто, поэтому 👇 🐍 stepik.org/course/63085/promo 👉 специально для тебя создал бесплатный топовый курс по Python 👉 В нем тебя ждет: 📗 более 400 практических заданий на программирование 📗 более 250 тестовых заданий на проверку материала 📗 десятки часов видеоматерилов по теории 📗 видеоразборы решения заданий 📗 текстовые материалы по урокам, примеры кода 📗 доступ к закрытому чату с дружественной обстановкой 📗 сертификат в случае успешного прохождения курса
@EscanorTime
@EscanorTime 4 жыл бұрын
это имелось в виду под "время между соседними вызовами?" def timer(): start = perf_counter() def inner(): nonlocal start result = perf_counter() - start start = perf_counter() return result return inner
@ЕрвандАгаджанян-в3к
@ЕрвандАгаджанян-в3к 3 жыл бұрын
Спасибо! Шикарный и очень подробный разбор темы замыканий)
@АлексейЕгоров-к9е
@АлексейЕгоров-к9е Жыл бұрын
Круто. хорошие 2 урока. помогли мне лучше понять решения некоторых задач. Можно для разнообразия было показать counter(mult)(12, 3, 4), что и так можно записать, а то бывают такие задачки. найти сумму чисел ch_sum(10)(20)(30)() или умножение 7*5 в виде функций print(seven(time(five()))).
@galinaoliver5624
@galinaoliver5624 Жыл бұрын
Насколько же крутой материал!!!! Благодарю
@slavaseredenko4846
@slavaseredenko4846 2 жыл бұрын
Спасибо, мне очень помогло. Чудесный пример кеша в декораторах
@ananasanimator6049
@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-Zhinzhilov
@Dmitrii-Zhinzhilov 2 жыл бұрын
Артём, благодарю!!! 🔥🔥🔥🔥
@АнастасияСитко-х9ю
@АнастасияСитко-х9ю 2 жыл бұрын
Самый лучший канал!
@LukasFeinberg
@LukasFeinberg Жыл бұрын
4:00 читать переменные из области выше можно, а чтобы именно изменить их нужно дать к ним доступ с помощью nonlocal
@2173045
@2173045 Жыл бұрын
спасибо , тоже об этом подумал
@finishae
@finishae 2 жыл бұрын
Ничеге не понимаю, но рад за тебя крутыш) Молодец!
@egorpython9683
@egorpython9683 4 жыл бұрын
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д
@НиколайМануилов-и1д 3 жыл бұрын
Вроде теперь всё чстало более менее понятно, но вот последний пример для меня до сих пор сложен в понимании
@tolevich
@tolevich Жыл бұрын
def timmer(): start = perf_counter() temp = 0 def inner(): nonlocal temp nonlocal start temp = round((perf_counter() - start), 2) start = perf_counter() return temp return inner
@vitalykargin
@vitalykargin Жыл бұрын
Почему в 1 части на 2:49 мы не объявили во вложенной функции name и не писали nonlocal и это работало. А в этом видео на 3:56 надо писать nonlocal для sum? Такая же история в этом видео на 5:53 с переменной start. Она не требует nonlocal почему?
@vitalykargin
@vitalykargin Жыл бұрын
Сам себе отвечаю Операторы global и nonlocal используются в области видимости той функции, где будет требуется изменение переменной;
@НиколайМануилов-и1д
@НиколайМануилов-и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
@egoroffchannel
@egoroffchannel 3 жыл бұрын
а какое задание делаешь? напомни плиз
@НиколайМануилов-и1д
@НиколайМануилов-и1д 3 жыл бұрын
@@egoroffchannel ну по видео дз - что бы счетчик показывал время между двумя ближайшими вызывами функции
@Larriva666
@Larriva666 Жыл бұрын
Привет! А что вы за IDE используете?
@gorin1337
@gorin1337 Жыл бұрын
это pycharm
@zingmao
@zingmao 4 жыл бұрын
А будут ли видео по обработке исключений?
@egoroffchannel
@egoroffchannel 4 жыл бұрын
да, конечно
@pentium_dynamo-machine
@pentium_dynamo-machine Жыл бұрын
почему в первом примере при использовании списка во внутренней функции не пишется nonlocal? Эта переменная же не описана во внутренней функции и нам надо указать, что она взята из вне и при этом список тоже изменяется, как и переменные summa и count далее
@БлезПаскаль-э6р
@БлезПаскаль-э6р Жыл бұрын
Nonlocal используется для изменения переменной, а не для чтения
@Dennis_Ritchie
@Dennis_Ritchie Жыл бұрын
список - изменяемый объект число - неизменяемый объект
@sharpd1173
@sharpd1173 4 жыл бұрын
Спасибо. Будут ли уроки по фреймвокам? Типа Flask,django,PyQt
@egoroffchannel
@egoroffchannel 4 жыл бұрын
по джанго точно планируются
@PRO-pt6ew
@PRO-pt6ew 4 жыл бұрын
@@egoroffchannel Было бы круто!
@NikitKiselevchannel
@NikitKiselevchannel Жыл бұрын
а почему при numbers.append мы не объявляли nonlocal numbers? ведь метод списка изменяет исходный список, или как тут логика работает?
@KnightOfSoad
@KnightOfSoad Жыл бұрын
Список является изменяемым типом данных (mutable), это означает что он сохраняет единую ссылку на объект списка. А переменные из видео count и sum содержат тип данных integer, который является неизменяемым типом (immutable) - изменять значений переменной данного типа означает менять ссылку на объект (0 имеет одну ссылку, 1 имеет другую, 2 имеет другую и тд). Проверить это можно через встроенную функцию id(arg): у каждого числа будет свой id, в то время как создав список, сколько бы данных в него не залезло, он сохранит свой изначальный id. Другими словами count += 1 это каждый раз создание нового объекта integer, а list.append(number) это обновление существующего объекта списка - это и составляет основу такого разного поведения этих типов данных в замыкании. Использование ...nonlocal x... как бы говорит "я беру переменную 'x' из области видимости уровнем ниже, чтобы у меня была возможность переприсвоить ее"
@margaritawin-win8976
@margaritawin-win8976 3 ай бұрын
до изучения ооп: -это что за бубуйня?? после изучения ооп: -да изи вообще
@sallastanec5851
@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-u2e
@VyacheslavOrlov-u2e 3 жыл бұрын
Тяжело заходит тема замыканий, пересматриваю ее уже после декораторов from time import perf_counter def timer(): start = perf_counter() def inner(): nonlocal start print(perf_counter() - start) start = perf_counter() return inner
@НиколайМануилов-и1д
@НиколайМануилов-и1д 3 жыл бұрын
С декоработами уже проще воспринимать?
@lera6801
@lera6801 4 жыл бұрын
А почему когда мы использовали переменную numbers, то не приходилось объявлять nonlocal, он ведь тоже изменяется
@egoroffchannel
@egoroffchannel 4 жыл бұрын
Можно было написать, от этого ничего бы не изменилось Я не писал, потому что списки являются изменяемыми объектами. И то что, мы с ними делаем в функции будет видно и вне функции
@egoroffchannel
@egoroffchannel 4 жыл бұрын
devman.org/qna/26/v-pitone-peremennye-peredajutsja-po-ssylke-ili-po-znacheniju-est-podvodnye-kamni/
@a98cb985
@a98cb985 4 жыл бұрын
А есть какой-то практический пример использования замыканий?
@PRO-pt6ew
@PRO-pt6ew 4 жыл бұрын
Видимо, в декораторах
@ЕрвандАгаджанян-в3к
@ЕрвандАгаджанян-в3к 3 жыл бұрын
Декораторы работают на основе замыканий.
@АлексейМельников-л3п
@АлексейМельников-л3п 3 жыл бұрын
спасибо за полезное видео. -_-
@АлексейА-г8ы
@АлексейА-г8ы 10 ай бұрын
А почему списку во вложенной функции так же не приписывался нонлокал? По той же аналогии что и summa и count
@СветланаФайнштейн
@СветланаФайнштейн 8 ай бұрын
Числа - неизменяемый тип, поэтому перед присвоением значений переменные summa и count описываются как nonlocal. Список - изменяемый тип, для него можно вызывать его методы, здесь - метод append/. Но вот если бы вы во внутренней функции присвоили списку какое-то значение, например, пустой список - пришлось бы так же предварительно объявлять его как nonlocal.
@alexsmth8925
@alexsmth8925 3 жыл бұрын
Скажите, почему когда обращались к массиву из функции inner(), то его не объявляли как nonlocal, а когда к переменной обращались, то ее объявляли nonlocal?
@egoroffchannel
@egoroffchannel 3 жыл бұрын
список потому является изменяемым объектом, поэтому я могу к нему обращаться из другой области видимости и ИЗМЕНЯТЬ
@ruselwow
@ruselwow 4 жыл бұрын
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 не обнуляется при повторном вызове а()? Ведь после завершения работы функции ее переменные должны стираться из памяти
@egoroffchannel
@egoroffchannel 4 жыл бұрын
в этом и смысл замыкания. функция 1 возвращает не только функцию 2 но и связанную с ней переменную
@АлексейЕгоров-к9е
@АлексейЕгоров-к9е Жыл бұрын
я тож не понял это. думал раз она явно объявляется 0, то при повторном вызове тоже обязана быть нулем. думаю это надо просто запомнить, понять не возможно!!! )))) эти замыкания как женщины. вроде всё нормально работает, но ни фига не понятно )
@Dm-if3vl
@Dm-if3vl 4 жыл бұрын
Спасибо
@bulik1384
@bulik1384 3 жыл бұрын
интересно почему в первом примере не нужно прописывать nonlocal numbers, ведь мы добавляем числа в numbers, а значит изменяем его
@egoroffchannel
@egoroffchannel 3 жыл бұрын
потому что список - это изменяемый объект, в локальной области не найдется эта переменная, питон пойдет ее искать в след области видимости и там уже по имени переменной мы изменим список
@bulik1384
@bulik1384 3 жыл бұрын
@@egoroffchannel спасибо
@irinabaranovskaya6025
@irinabaranovskaya6025 3 жыл бұрын
здравствуйте! мне иногда не очень понятна разница между вызовом return и print во внутренней функции, например, в первом примере: def average(): #поиск среднего all = [] def inneer_fun(a): all.append(a) print(sum(all)/len(all)) print(all) return inneer_fun
@egoroffchannel
@egoroffchannel 3 жыл бұрын
не понял вопроса
@fl4mescare
@fl4mescare Жыл бұрын
посмотри лучше видео про функции ещё разок) они могут возвращать значения, а могут печатать что-либо при их вызове.. лучше пересмотри, думаю станет ясно
@oksanabogza7728
@oksanabogza7728 4 жыл бұрын
А где найти тему "декоратор"?
@egoroffchannel
@egoroffchannel 4 жыл бұрын
она только появится на этой недели
@bulik1384
@bulik1384 3 жыл бұрын
там точно речь о секундах? код срабатывает мгновенно, но ответ в консоли 8-10 сек
@ВячеславВоронин-т3о
@ВячеславВоронин-т3о 3 жыл бұрын
Обьяните в чем разница между отсутствием скобок ()и их налмчием в return inner в чем их вобще смысел если поставить ошибку пишет . Реально не ясно что возвращает return inner() и и что вернет return inner в чем смысел скобок каке действие они создают
@deniskrepak
@deniskrepak 3 жыл бұрын
inner со скобками вызывает функцию, а return inner просто возвращает функцию, не вызывая её.
@samirahuseynli6956
@samirahuseynli6956 3 жыл бұрын
Почему «start» не nonlocal?
@egoroffchannel
@egoroffchannel 3 жыл бұрын
мы его не изменяем, и найти это имя питон может без nonlocal
@samirahuseynli6956
@samirahuseynli6956 3 жыл бұрын
Решение: def timer(): time = [perf_counter()] def inner(): some_time = perf_counter() diff = some_time - time[-1] time.append(some_time) return diff return inner
@Mcmern
@Mcmern 3 жыл бұрын
# Программа считает время между вызовами "экзмпляров" функции 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
@Mcmern
@Mcmern 3 жыл бұрын
Привет, классные уроки.👍. Вопрос по последнему примеру. Почему если я вызываю функцию 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
@egoroffchannel
@egoroffchannel 3 жыл бұрын
сама функция func вызывется, но так как в inner нету слова return то он вернет None
@Mcmern
@Mcmern 3 жыл бұрын
@@egoroffchannel спасибо
@nto2503
@nto2503 4 жыл бұрын
И как найти время между двумя соседними вызовами?
@deniskrepak
@deniskrepak 3 жыл бұрын
Так легко ведь. Переменную старт в функции inner просто меняете и все.
@mefodymo7456
@mefodymo7456 4 жыл бұрын
Сложно
@lexalexa8487
@lexalexa8487 3 жыл бұрын
1
@alexanderselesnev3739
@alexanderselesnev3739 4 жыл бұрын
Решение: 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()) Как-то так?
@egoroffchannel
@egoroffchannel 4 жыл бұрын
начало замера вызова декорируемой функции не в том месте
@alexanderselesnev3739
@alexanderselesnev3739 4 жыл бұрын
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() Или я что-то не понимаю?
@alexanderselesnev3739
@alexanderselesnev3739 4 жыл бұрын
Да-да, пропустил return inner
Декораторы  в Python Часть 1. Decorator Python
11:06
egoroff_channel
Рет қаралды 124 М.
Замыкания в Python. Closure Python
10:02
egoroff_channel
Рет қаралды 78 М.
How Much Tape To Stop A Lamborghini?
00:15
MrBeast
Рет қаралды 192 МЛН
这是自救的好办法 #路飞#海贼王
00:43
路飞与唐舞桐
Рет қаралды 132 МЛН
46 Генераторы списков Python | List comprehension
10:30
egoroff_channel
Рет қаралды 101 М.
Пакеты в Python. Файл __init__, переменная __all__
11:48
Вложенные функции Python
8:55
egoroff_channel
Рет қаралды 45 М.
Замыкания (Closures) в Python
30:54
Python Russian
Рет қаралды 16 М.
How Much Tape To Stop A Lamborghini?
00:15
MrBeast
Рет қаралды 192 МЛН