Автор оригинала: Pankaj Kumar.
Чтобы понять закрытие Python, у вас должна быть идея вложенной функции и класса Python. Фактически закрытие Python также является функцией, которая предоставляет возможность инкапсулировать некоторые данные с кодом.
Python вложенная функция
def funcOut(): print("Now we are in funcOut.") def funcIn(): print("This function is defined inside the funcOut.\nThis one is called a nested Function.") print("Here we will call the funcIn that is defined.") funcIn() print("We are in _main_.\nCalling the funcOut.") funcOut()
В приведенном выше коде Фунсин
вложена функция внутри Funcout
Отказ Если вы посмотрите на выход вышеуказанного кода, вы поймете вызову последовательность функций. Выход будет:
We are in _main_. Calling the funcOut. Now we are in funcOut. Here we will call the funcIn that is defined. This function is defined inside the funcOut. This one is called a nested Function.
Поворачивая функции в закрытие Python
Скажи, ты хочешь есть Все функциональные возможности, которые делаются Фунсин
от Funcout
Отказ
Как вы можете сделать это? Что приходит в ваш разум?
Вернуть право !!!
Обычно мы возвращаем значение или ссылку на функцию. Но здесь нам нужно вернуть все функциональные возможности Фунсин
Отказ Если мы просто перезаписываем функцию, вызывающую Фунсин ()
в линия 6 по Вернуть Фунсин
Тогда мы достигли того, что мы хотим.
То, что мы только что сделали, известна как закрытие в Python Отказ Вы поймете закрытие Python более четко, когда вы проходите весь учебник.
Идея закрытия Python
Итак, из вышесказанного мы узнали, что когда функция возвращает другую функцию, определенную в (т. Е. Вложенной функции), это называется закрытие. Теперь посмотрим на структуру образца закрытия.
Структура закрытия Python
def closureFunc(): def nestedFunc(): # ... statements ... print(" Welcome To Closure ") return nestedFunc get = closureFunc() get()
Это выведет:
Welcome To Closure
В приведенном выше коде, согласно названию функции, надеюсь, вы понимаете внешнюю функцию, является функцией закрытия, в которой существует вложенная функция, которая возвращается функцией закрытия.
Закрытие Python встраивает данные с кодом
Когда мы создаем объект класса, этот объект содержит некоторую информацию с ней. Так же, как это закрытие встраивает данные с кодом.
Давайте рассмотрим с примером кода
def closureFunc(n): def nestedFunc(): # ... statements .. print("Welcome To Closure ") print("You have sent argument %d + 10 = %d" % (n, n+10)) return nestedFunc getting = closureFunc(12) getting()
Это выведет:
Welcome To Closure You have sent argument 12 + 10 = 22
Линия уведомления 7 и 8 – Получение
Переменная сейчас работает как функция. Все функциональные возможности внутренней функции вложенной функции теперь делают его.
Закрытие Python вспоминает свой контекст
Посмотрите на следующий код, мы удалили Closurefunc
Отказ
def closureFunc(sum): def nestedFunc(): # ... statements .. print("Welcome To Closure ") print("You have sent argument %s" % sum) return nestedFunc getting = closureFunc(12) del closureFunc getting()
Это выведет:
Welcome To Closure You have sent argument 12
Это сила закрытия. Даже если вы удалите функцию закрытия Получение
Помните его контекст, где это было и что это делает. Вот почему мы получили выход Получение
Даже после удаления фактической функции.
Использование нелокальной переменной в закрытиях
Давайте посмотрим на другой пример. Следующее закрытие добавляет все число до определенного диапазона, который дается в качестве аргумента к функции закрытия.
def closureFunc(up): val = 0 def nestedFunc(): nonlocal val print("Welcome To Closure ") for i in range(up+1): val += i print("Total is = %d" % val) return nestedFunc getting = closureFunc(5) getting()
Это выведет:
Welcome To Closure Total is = 15
Обратите внимание, что мы взяли переменную VAL в CloseureFunc и повторно повторно повторно повторно повторно повторно в nestedfunc
Объявив как нелокальный к этой функции, используя ключевое слово нелокальный
Отказ
Если вы не объявите некомкале, вы получите ошибку, что локальная переменная « валь «Предполагается до назначения, это означает, что он будет считаться локальной переменной для nestedfunc
функция.
Закрытие с аргументом
Давайте посмотрим на последний пример этого урока. В этом коде мы хотим предоставить аргумент в NestedFunc. И соблюдайте вывод для разных ценностей.
def closureFunc(up): val = 0 def nestedFunc(arg): nonlocal val print("Welcome To Closure ") for i in range(up+1): val += i val *= arg print("Total is = %d" % val) return nestedFunc retFunc = closureFunc(5) retFunc(10) retFunc(4)
Ниже приведены изображение, показывает вывод вышеуказанной программы закрытия Python.
Если вы можете понять, почему второй выход – 660, то я должен сказать, что вы получили знания из этого урока.
Вывод составляет 660, потому что, когда строка 11 выполняется, переменная установлена.
Тогда, когда линия 12 выполняется, nestedfunc
Выполнение и переменная установлена.
После этого, когда мы снова вызовем функцию с разным аргументом 4 в строке 13, то ClosureFunc имеет значение. Таким образом, в LOOP VAL обновляется на 150 плюс суммирование от 1 до 5, что равно. Затем умножьте его с 4, что равно 660. Вот и все. Это то, что находится закрытие Python. Надеюсь, что это учебное пособие полезно для вас. Лучше всего удачи, кодируя с закрытием.
__Cluade__
Все объекты функции имеют __Cluer__
Атрибут кортежа, который возвращает объекты клетки, если это функция закрытия.
def closureFunc(up): val = 0 def nestedFunc(arg): nonlocal val print("Welcome To Closure ") for i in range(up + 1): val += i val *= arg print("Total is = %d" % val) return nestedFunc retFunc = closureFunc(5) print(retFunc.__closure__) print(retFunc.__closure__[0].cell_contents) print(retFunc.__closure__[1].cell_contents) retFunc(10) print(retFunc.__closure__) print(retFunc.__closure__[0].cell_contents) print(retFunc.__closure__[1].cell_contents) retFunc(4) print(retFunc.__closure__) print(retFunc.__closure__[0].cell_contents) print(retFunc.__closure__[1].cell_contents)
Он будет создавать следующие выводы, а также напечатаны значения контекста закрытия и вал также напечатаны.
(, | ) 5 0 Welcome To Closure Total is = 150 ( | , | ) 5 150 Welcome To Closure Total is = 660 ( | , | ) 5 660 |
Закрытие Python – это хорошо знать особенность, но оно усложняется, если у нас есть больше внутренних функций и аргументов. Вы можете достичь то же самое с классами и нормальными функциями. Так что используйте закрытие Python с осторожностью.
Ссылка: Вопрос в стойке