Рубрики
Без рубрики

Закрытие Python

Пример закрытия Python Учебное пособие, закрытие в Python, Python вложенная функция, нелокальная переменная Python, нелокальная переменная, локальная переменная, упомянутая до назначения

Автор оригинала: 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 с осторожностью.

Ссылка: Вопрос в стойке