Замыкания (Closures) в Python

Поділитися
Вставка
  • Опубліковано 20 лип 2021
  • Сегодня поговорим о такой интересной вещи как замыкания в Python.
    По сути замыкание - это внутренняя функция, которая возвращается из внешней и использует переменные из внешнего скоупа (которые ей не принадлежат). Функция как бы "замыкает", захватывает переменные из внешней функции. Вы могли встречать такое например в декораторах.
    Каждый объект замыкания независим, они не пересекаются, у каждого свои данные.
    Замыкания это еще один шаг в сторону ООП, так как тут мы имеем некоторое состояние (данные) сокрытое от посторонних глаз и с которым можно взаимодействовать только с помощью заранее написанного интерфейса (функция).
    Замыкания могут быть полезны для того чтобы избегать использования global, а также и в других случаях, когда нам важно, чтобы наши данные не изменили невалидным способом, чтобы с данными работали только через нашу логику.
    НО(!) до этих данных тоже можно добраться при определенном желании, нужно понимать что нет полного сокрытия данных.
    Присоединяйтесь к помощи каналу, будет интересно)
    ✔️Бусти boosty.to/python_russian/donate
    ✔️Юмани 410011506612886
    Будь первым везде и всегда, включай уведомления о новых выпусках 🔔
    #Python #PythonRussian #PyCharm

КОМЕНТАРІ • 116

  • @user-xy5eq1ej2g
    @user-xy5eq1ej2g 2 роки тому +23

    Более доходчивых видео не видел. Огромное Спасибо! Ждем продолжения ...

    • @PythonRussian
      @PythonRussian  2 роки тому +2

      спасибо, а продолжение обязательно будет.

    • @mlr__roal_6867
      @mlr__roal_6867 Рік тому +3

      Согласен. Простым языком о сложных вещах. Автор-гений.

  • @user-tl2nd6fd4g
    @user-tl2nd6fd4g Рік тому +8

    Это самое лучшее и самое доступное видео по замыканию которое я видел!!! 500 баллов из 100!!

    • @PythonRussian
      @PythonRussian  Рік тому +1

      спасибо за ваше мнение, такие комментарии мотивируют меня продолжать снимать видео =)

  • @yuriismakota9574
    @yuriismakota9574 8 місяців тому +1

    Спасибо автору за урок! На конец то понял, как все устроенно!

  • @tryhard114
    @tryhard114 4 місяці тому +1

    удивительно..я неожидал такой подачи, это надо уметь так разжевать грамотно.. инста подписка!

  • @walter5485
    @walter5485 2 місяці тому +1

    I am a newbie on your channel, and this is the best explanation of the closure concept I've ever seen before !!!! Thank you for your help

    • @anbur9197
      @anbur9197 2 місяці тому

      how could you even understand what he was saying?

  • @uvou-u3316
    @uvou-u3316 Рік тому +1

    Начал не так давно изучать Пайтон и Ваш канал для меня стал открытием: максимально лаконичное но в то же время исчерпывающее изложение материала, приближенность к практике (частая проблема видео для начинающих: объясняют какие то понятия но не раскрывают тему, для чего это все нужно и зачем использовать в реале). Спасибо за Ваш труд!

  • @rollangrant8347
    @rollangrant8347 Рік тому

    Огромное тебе спасибо за твой труд!! 👍🙏

  • @user-lechat-lexus
    @user-lechat-lexus 2 роки тому +1

    Прекрасное объяснение, без воды, с демонстрацией кода по каждому обсуждаемому случаю и тонкостям использования, сам боженька не объяснил бы лучше) 👍

  • @kamilgabdullin
    @kamilgabdullin 2 роки тому +6

    Спасибо большое, очень доходчиво и понятно.

  • @netsdzian8009
    @netsdzian8009 Рік тому

    Лучший материал по замыканиям! Спасибо за видео!

  • @fanatxrona8329
    @fanatxrona8329 2 роки тому +3

    спасибо за офигенный, доходчивый видос с кучей примеров)

  • @pfk9025
    @pfk9025 2 роки тому +1

    Крутое объяснение. Главное, что есть примеры практического применения. Ждем новых видео)

  • @volodymyr8215
    @volodymyr8215 11 місяців тому +1

    Доступно.

  • @Ykropp
    @Ykropp 6 місяців тому +1

    Доступно объяснил. Спасибо!

  • @barboss8129
    @barboss8129 2 роки тому

    Самое ТОПОВОЕ объяснение которое только можно придумать!!!

  • @narikate2144
    @narikate2144 Рік тому

    Только вчера вас хвалил за объяснения работы с git, сегодня вы уже мне помогаете доразобраться с замыканиями, причем все, опять же, объясняется на пальцах. Спасибо!

  • @vasya8875
    @vasya8875 11 місяців тому

    Спасибо за отличное объяснение темы :)

  • @user-fm1mv8fo4h
    @user-fm1mv8fo4h Рік тому

    Самое подробное, что я смотрел. Как развернуто. Спасибо тебе!!!👍👍

  • @SaVa_144
    @SaVa_144 Рік тому

    Блин, классное объяснение. Простым языком и доходчиво.

  • @user-zh8ze4iw2n
    @user-zh8ze4iw2n 10 місяців тому

    Спасибо, большое за столь подробное и качественное объяснение темы.

  • @rrysovets4702
    @rrysovets4702 10 місяців тому

    Лучшее что я видел по теме замыкания !

  • @user-nd3yx3du7h
    @user-nd3yx3du7h Рік тому

    Неделю мучался с этой темой. Посмотрел больше 10 видео. Но только после твоего наконец разобрался.

  • @Bah1918
    @Bah1918 2 роки тому +2

    Замечательно.СПАСИБО.

  • @user-gc4ic9xc1j
    @user-gc4ic9xc1j Рік тому

    Мой мозг прояснился как никогда раньше, очень доходчивое видео

  • @mrFixSwitchHack
    @mrFixSwitchHack 7 місяців тому

    Самое доходчивое объяснение Замыкания с понятными примерами использования, спасибо!

  • @user-ch2oe7lu1x
    @user-ch2oe7lu1x 2 роки тому +1

    Классное видео, понятно и с примерами объяснено👍

  • @user-it3yo1sn6i
    @user-it3yo1sn6i Рік тому

    Отличный контент, спасибо большое

  • @VladStone
    @VladStone 2 роки тому +3

    честно говоря, я посмотрел видео про замыкание на еще 2-3 каналах, и в вашем видео реально самое лучшее объяснение, есть четкое определение - что вообще такое замыкание, зачем оно нужно, в чем его плюсы, и где оно вообще может использоваться! Спасибо

  • @kizik85
    @kizik85 2 роки тому

    Спасибо за объяснение!!!

  • @Posadskiy
    @Posadskiy Рік тому

    Ручка на крышке - атас!))
    Спасибо, дядь, буду готовить.

  • @VadimBorisov-ed4mj
    @VadimBorisov-ed4mj Рік тому +1

    Наконец все понял, спасибо!

  • @gecnepago
    @gecnepago 2 роки тому +1

    пожалуй лучшее видео по теме!! у вас талант)

    • @PythonRussian
      @PythonRussian  2 роки тому +1

      спасибо, благодаря таким отзывам и продолжаю снимать видео

  • @alexwrite6974
    @alexwrite6974 Рік тому

    Крутотень, спасибо!

  • @x-user-agent
    @x-user-agent 2 роки тому +2

    (после видоса про декораторы) ааа.... ну теперь понятно😆

  • @dimk7983
    @dimk7983 2 роки тому

    Спасибо, интересно было

  • @user-hh9cf1vd8j
    @user-hh9cf1vd8j Рік тому

    Классно! я как раз сижу свой первый полноценный проект делаю, и как раз использую global, и не задумался использовать класс, хотя уже пользуюсь ими, теперь пойду править свой код спасибо! продолжай пилить контент!

  • @stevem4806
    @stevem4806 10 місяців тому +1

    Спасибо!

  • @Laserball74
    @Laserball74 Рік тому

    Спасибо большое автору за хороший контент! 👌Закинул в избранное

  • @nikitabbrv5947
    @nikitabbrv5947 2 роки тому

    Шел третий день, как я гуляю по каналам, чтобы таки уяснить скрытый смысл замыканий. На каждом, конечно, узнаю новое)

  • @ba8318
    @ba8318 11 місяців тому

    уже второй день пытался осознать и переварить эти замыкания, и на середине этого видео наконец-то до меня дошло... короче лайк

  • @donfedor007
    @donfedor007 Рік тому

    Спасибо Вам!!! Очень помогла аналогия с ООП, так получилось, что я разобрался с ООП, но не совсем понимал замыкания(

  • @railsabbitovich408
    @railsabbitovich408 2 роки тому +1

    Красава)

  • @krolik_samurai
    @krolik_samurai Рік тому

    Большое спасибо за очередное полезное и подробное видео! Порекомендовал уже канал знакомым, чем могу ткскзть)
    Ps Раньше, кажись, можно было накидывать идеи для будущих видео. Если актуально и данной темы ещё не было, то как вариант - абстракция в программировании

  • @Perchik543
    @Perchik543 5 місяців тому

    Спасибо. Объяснение настолько подробное, что только дебил не поймёт. Но! есть один нюанс! Марк Лутц, в своей книге "Изучаем Python", которую вы посоветовали, написал ключевую вестч, которую Вы пропустили в своём видео. Есть вероятность, что я пропустил мимо ушей , но всё-таки дополню.
    Внутренняя ф-ция является такой же переменной как и все остальные, которые находятся во внешней. Т.е. внутренняя ф-ция- это локальная переменная с которой можно работать как и с объявленными напрямую. Т.е. Х=88, на локальном уровне def wraper(): или внутренняя def inner(): X=99 return X, - это тоже самое, что Х=99.
    Очень хорошо! Ещё раз СПАСИБО!

  • @user-ky6zj3gt6p
    @user-ky6zj3gt6p 14 днів тому

    Вот бы ещё покрупней писал, цены-бы не было. Будем искать другого спикера.
    Успехов бро!

  • @vor6758
    @vor6758 5 місяців тому

    Good

  • @azatgaleev1819
    @azatgaleev1819 2 роки тому

    спасибо

  • @alexeykolodochkin5826
    @alexeykolodochkin5826 2 роки тому +1

    Вот теперь добро победит global ).

  • @kiryllshynharow9058
    @kiryllshynharow9058 Рік тому

    24:42
    pow__ = pow_(2)
    pow_2 = pow_(3)
    а логичнее было бы назвать
    pow2 = pow_(2)
    pow3 = pow_(3)
    тогда пример бы был хорош не только не только для объяснения но и выглядел как на практике где-то даже вполне применимый

  • @user-jm7zu1ph2e
    @user-jm7zu1ph2e 9 місяців тому

    Доброго времени суток! Обьясните пожалуйста) Почему после каждого нового вызова, в список добавляется по одному имении. Спасибо)

  • @AdmiralUshakovvv
    @AdmiralUshakovvv 2 роки тому +1

    нужен плейлист про ооп)))

    • @PythonRussian
      @PythonRussian  2 роки тому +2

      да, это в планах, пока боюсь замахиваться, надо придумать как верно все объяснить, чтобы и понятно и в дебри не залезть и не упустить важного.

    • @AdmiralUshakovvv
      @AdmiralUshakovvv 2 роки тому

      @@PythonRussian топи мен)))

    • @AdmiralUshakovvv
      @AdmiralUshakovvv 2 роки тому

      @@PythonRussian и мы с тобой топнем)

  • @viktorsokolov8153
    @viktorsokolov8153 Рік тому

    Спасибо за тему. Практический вопрос. Игра быки-коровы. Ответ во вью как раз реализовывал через global. Решил попробовать с замыканием. На первый запрос с фронта все работает, на второй - уже нет. Пропробовал реализовать count. Каждый раз count выдает 1, то есть обнуляется значение перед каждым новым запросом. Вопрос - как можно сохранить значения wrapper во вью?

    • @viktorsokolov8153
      @viktorsokolov8153 Рік тому

      Прошло 4 месяца и я нашел ответ) Работает closure с web socket. Фух, ура). P.S. с удовольствием пересмотрел урок.

  • @user-qp8of2vk9y
    @user-qp8of2vk9y Рік тому

    Подскажите, а как быть, если надо обратиться к students (в видео) из другого файла проекта? Т.е. в файле лежит функция, которую мы импортируем туда, где объявлен students.
    Эта функция обращается к students. -> Students надо импортировать в файл, где описана функция. -> Получается циклический (круговой) импорт. Не импортировать students из основного файла вообще и не обращать на негодование PyCharm?
    По идее, при импорте функции из файла в основной, функция попадет туда, где об этой переменной уже известно и всё должно быть хорошо.

    • @user-qp8of2vk9y
      @user-qp8of2vk9y Рік тому +1

      Отвечу сам вариант, который нашел. Может есть получше методы.
      Надо вынести объявление переменной students так же в отдельный файл и уже его импортировать. Идеально подошел вариант с __init_.py файлом. Не понимал как это работает, но где то видел. Чисто экспериментально попробовал. Сработало идеально. Ну и потом уже прочитал механизм работы __init__.py

  • @user-gt9tw5yq1p
    @user-gt9tw5yq1p 5 місяців тому

    Большое количество времени пытаюсь въехать в замыкания и декораторы, но постоянно остаётся чувство, что что-то недопонял

  • @user-kq3xk8pu9i
    @user-kq3xk8pu9i 2 роки тому

    @Python Russian Привет! На 16 минуте не понял причем тут неизменяемый тип, если на 10 строчкe использовать += [name] вывалится такая же ошибка, и фиксить придется тоже с помощь nonlocal

    • @PythonRussian
      @PythonRussian  2 роки тому

      приветствую! да, верно, неизменяемый тип тут не при чем, я там сказал что подробности в видео про нонлокал, просто оговорился.

    • @user-kq3xk8pu9i
      @user-kq3xk8pu9i 2 роки тому

      @@PythonRussian А можете объяснить, почему с методом append ничего не ломается, не смог докопаться до истины сам

    • @PythonRussian
      @PythonRussian  2 роки тому

      @@user-kq3xk8pu9i а видео про нонлокал не стал смотреть? там с примерами показываем. Когда ты используешь аппенд или другой метод ты не создаешь новый объект (как например с интом -каунт), а потому никаких проблем не возникает. А вот когда ты каунт меняешь или для списка пишешь += (то есть создаешь новый) то интерпретатор сразу же считает что речь идет о локальной переменной, которую следует искать тут же в функции. И слова глобал и нонлокал нам нужны как раз чтобы подсказать питоше что переменную стоит искать не в данной функции а где то выше по скоупам. Без них он считает что ты меняешь какую то переменную не создав ее. Короче смотреть можно без проблем, но если менять (не внутренними методами!) то нужен нонлокал.

    • @user-kq3xk8pu9i
      @user-kq3xk8pu9i 2 роки тому +1

      ​@@PythonRussian Конечно я смотрел, я вообще фанат канала, очень структурированное повествование.
      Я проверил по id, += не создает новый объект для списков. Поэтому мне и не понятно почему всё багуется
      a = [12]
      b = [1]
      print(id(a)) #140668672319680
      a += b
      print(id(a)) #140668672319680

    • @PythonRussian
      @PythonRussian  2 роки тому

      @@user-kq3xk8pu9i то что копаешь и разбираешься -это отлично. А теперь взгляни на это не в плане того как реализовано под капотом конкретная операция, а что она собой представляет. a+=1 по сути значит а = а+1, то есть увеличиваем а, а потом полученному объекту присваиваем ссылку, то есть переменная а будет уже ссылаться на результат вычислений. Понимаешь? То же и со списком a_list+=[3] явно говорит интерпретатору что ссылку надо будет потом перекинуть на новый, увеличенный список. В этот то момент интерпретатор и думает, что раз речь идет о изменении ссылки то это локальная переменная... А далее уже обсуждали. Если совсем упрощать, то наличие в выражении переменной и знака равно потребует для нее нонлокал. Кстати, обрати внимание что аналогичная операция выполненная вот так a_list.extend([3]) - не потребует нонлокал. Сможешь теперь объяснить почему?

  • @x-user-agent
    @x-user-agent 2 роки тому +1

    спасибо👍 одного не понял - как аргумент передаваемый при вызове внешней функции попадает во внутреннюю, при том что во внешней только ()?

    • @PythonRussian
      @PythonRussian  2 роки тому

      это в каком из примеров? а то я не понял как это () и при этом аргумент передаваемый функции

    • @x-user-agent
      @x-user-agent 2 роки тому

      @@PythonRussian ну или параметры) у нас names() - внутри не указано никаких принимаемых параметров, а когда мы вызываем students('vasya') этот вася каким-то загадочным путем попадает в вызов inner в виде inner('vasya'). вот это непонятно. какбу-то должно быть что-то вроде def names (name:str) .... return inner(name). может это какое-то соглашение в питоне, что если ничего не обьявлено и идет вызов внутренней функции в return то то что пришло в параметрах при вызове внешней функции по умолчанию попадает во внутреннюю?

    • @PythonRussian
      @PythonRussian  2 роки тому

      @@x-user-agent о, так тебе рано пока замыкания, посмотри видео про декоратор например. Тут фишка в том, что мы функцию иннер вернули из нейм. Не вызвали, а вернули. И как раз она принимает нейм. В общем тебе нужно посмотреть как внутренняя функция возвращается из внешней.

    • @x-user-agent
      @x-user-agent 2 роки тому

      @@PythonRussian смотрел) но видно не отложилось в памяти как это работает) пересмотрю еще раз, спасибо

    • @PythonRussian
      @PythonRussian  2 роки тому +1

      @@x-user-agent а ты лучше код примеров понабирай руками, поэкспериментируй, тебе главное понять что мы возвращаем функцию а не ее результат.

  • @user-xy5eq1ej2g
    @user-xy5eq1ej2g 2 роки тому

    Хочу предложить новую тему: - "Python и работа с Типами". Python не жестко типизированный язык и как ПРАВИЛЬНО работать с типами очень важно!

    • @PythonRussian
      @PythonRussian  2 роки тому +3

      не понимаю о чем вы, в питоне строгая типизация, хоть и динамическая. Правильно работать с типами надо согласно их предназначению.

  • @Makaler
    @Makaler 2 роки тому

    А что это за запись
    inner(value: int) -> float:
    Не понимаю...

    • @PythonRussian
      @PythonRussian  2 роки тому +1

      ua-cam.com/video/XuYZwhIvR5w/v-deo.html

  • @Max_Rabotyaga
    @Max_Rabotyaga Рік тому +2

    Очень грустно, когда девочки и мальчики не пересекаются ((((

  • @x-user-agent
    @x-user-agent Рік тому +1

    решил пересмотреть - получается замысловатый способ создать переменную с декоратором 😆 еще не ооп, но уже... методы что ли

  • @everythingforyoutube4031
    @everythingforyoutube4031 Рік тому

    if __name__ == '__main__': объясните пожалуйста зачем это логическое условие и что это означает

  • @MrSmallChe
    @MrSmallChe 2 роки тому +1

    через лямбду не понятно как сделать аналог вложеной функции с добавлением в список! не понятно как посмотреть состояние переменной(пример с pow) ? (метода call_contents нет) . как вообще работать с такими "переменными" ведь по факту она просто ведёт на функцию в памяти

    • @PythonRussian
      @PythonRussian  2 роки тому +1

      пример с лямбдой был именно примером, как можно написать короче, если переменную захватываем из параметра внешней функции. Это вовсе не рекомендация к действиям. Состояние уже никак не посмотреть без копания внутри замыкания (я показывал пример), как раз само замыкание по идее и должно тебе давать ту инфу, что нужно, это единственный верный способ взаимодействия. Если логика какая то хитрая то уже рекомендуется нормальный класс писать, замыкание - это вещь специфическая. ТО есть замыкание это не способ посмотреть что там замкнуто, а способ как то работать с этим, в возвращаемом результате должно быть то, что тебе нужно. Почитай у Марка Лутца, он то получше объясняет.

    • @MrSmallChe
      @MrSmallChe 2 роки тому

      @@PythonRussian можно ещё раз обьяснить ? как работать с замыканиями? если такая переменная по факту ссылка на функцию а не на значение....ну т.е ничего я с ней не могу поделать (говорилосьчто это ЗАМЕНА глобальным переменным)

    • @PythonRussian
      @PythonRussian  2 роки тому +1

      @@MrSmallChe замыкания -это механизм, он просто есть и нужно понимать как он работает. В том числе да -можно заменить глобальные переменные. И как раз пример с каунт это показывает. Ты получаешь ссылку на функцию в которой можешь увеличивать или уменьшать счетчик, а если передать туда 0 то ты просто получишь текущее значение. То есть вся работа с счетчиком скрыта внутри замыкания и ты можешь настроить логику такого взаимодействия не боясь что кто-то поменяет значение счетчика в обход твоей логики.

    • @MrSmallChe
      @MrSmallChe 2 роки тому

      @@PythonRussian в общем замыкания это кастрированные атрибуты обьекта класса, я понял.

    • @PythonRussian
      @PythonRussian  2 роки тому

      @@MrSmallChe да, это по сути объект урезанный в возможностях по сравнению с объектом самописного класса.

  • @user-gc4ic9xc1j
    @user-gc4ic9xc1j Рік тому

    как сделать такую тему в пайчарме?

    • @PythonRussian
      @PythonRussian  Рік тому

      в плагины зайди, найди Dark Purple, установи и примени

  • @user-gf7fr8qw2e
    @user-gf7fr8qw2e 2 роки тому

    откуда берет параметр value аргументы?

    • @PythonRussian
      @PythonRussian  2 роки тому +1

      получает при вызове функции. Мы же иннер вернем, а она принимает на вход именно велью. Если в видео не понял -почитай как у Лутца написано

  • @maximmaxim8374
    @maximmaxim8374 Рік тому

    пока смотрел, ракета ударила по городу
    наша реальность, мда

  • @user-ll5ic3of6j
    @user-ll5ic3of6j 8 місяців тому

    А зачем вообще нужно замыкание ведь мы можем просто функционал двух функций names и inner объединить в рамках одной функции?

  • @spiwt
    @spiwt 5 місяців тому

    Зачем нужны замыкания если можно реализовать тоже самое с помощью классов

  • @user-xy5eq1ej2g
    @user-xy5eq1ej2g 2 роки тому

    Скажите, Python Russian, можно Вам показать свою поделку на основе Замыкания? Не хочется тратить ваше время зря ...

    • @PythonRussian
      @PythonRussian  2 роки тому

      если не большую только - кинь на почту мне ссылку на гит или сам код.

  • @GRECHKA230
    @GRECHKA230 29 днів тому

    Замыкание - это вор, который запоминает местонахождение дома и грабит его.

  • @Daloshka
    @Daloshka 11 місяців тому +1

    а я создавал глобальную переменную как дурак

    • @PythonRussian
      @PythonRussian  11 місяців тому

      все с этого начинают

  • @andynaz7044
    @andynaz7044 Рік тому

    Hикакого "замыкания" там не происходит! Там происходит "смыкание" функции и скоупа. Именно в этом смысл всего этого механизма.
    Неужели не пришло в голову хоть разок посмотреть в словаре перевод слова CLOSURE и не пытаться прикручивать русское слово ЗАМЫКАНИЕ к объяснению сабжа??
    Правильно было бы ввести в оборот слово СМЫКАНИЕ, но как прижилось, так и прижилось.

    • @PythonRussian
      @PythonRussian  Рік тому

      в русском языке есть и слово замыкание. Оголенный провод болтается (это свободная переменная) и ударяется о нечто стационарное металлическое (это функция), происходит замыкание, после чего они оказываются соединены. Вполне описывает ситуацию. Но я за, если вы напишете книгу или начнете обучать людей использовать слово "смыкание", им правда нелегко будет на собеседованиях и при общении, но зато ваш пыл будет к месту.

    • @BohdanVR666
      @BohdanVR666 Рік тому

      Русский язык это не про логику