Прежде чем понять, что такое замыкание, мы должны сначала понять, что такое вложенные функции и нелокальные переменные.
Вложенные функции в Python
Функция, определенная внутри другой функции, называется вложенной функцией. Вложенные функции могут обращаться к переменным заключающей области.
В Python доступ к этим нелокальным переменным можно получить только в их области, а не за ее пределами. Это можно проиллюстрировать следующим примером:
# Python program to illustrate
# nested functions
def outerFunction(text):
text = text
def innerFunction():
print(text)
innerFunction()
if __name__ == '__main__':
outerFunction('Hey!')
Как мы видим, функция innerFunction() может быть легко доступна внутри тела внешней функции, но не за ее пределами. Следовательно, здесь innerFunction() рассматривается как вложенная функция, которая использует текст в качестве нелокальной переменной.
Закрытие Python
Замыкание-это объект функции, который запоминает значения в охватывающих областях, даже если они отсутствуют в памяти.
- Это запись, которая хранит функцию вместе со средой: сопоставление, связывающее каждую свободную переменную функции (переменные, которые используются локально, но определены в охватывающей области) со значением или ссылкой, к которой было привязано имя при создании закрытия.
- Закрытие—в отличие от простой функции—позволяет функции получать доступ к этим захваченным переменным через копии их значений или ссылок закрытия, даже если функция вызывается за пределами их области действия.
# Python program to illustrate
# closures
def outerFunction(text):
text = text
def innerFunction():
print(text)
# Note we are returning function
# WITHOUT parenthesis
return innerFunction
if __name__ == '__main__':
myFunction = outerFunction('Hey!')
myFunction()
Output:
omkarpathak@omkarpathak-Inspiron-3542:
~/Documents/Python-Programs/$ python Closures.py
Hey!
- Как видно из приведенного выше кода, замыкания помогают вызывать функции, выходящие за их рамки.
- Функция Внутренняя функция имеет свою область применения только внутри внешней функции. Но с использованием замыканий мы можем легко расширить его область действия, чтобы вызвать функцию, выходящую за ее рамки.
# Python program to illustrate
# closures
import logging
logging.basicConfig(filename='example.log',
level=logging.INFO)
def logger(func):
def log_func(*args):
logging.info(
'Running "{}" with arguments {}'.format(func.__name__,
args))
print(func(*args))
# Necessary for closure to
# work (returning WITHOUT parenthesis)
return log_func
def add(x, y):
return x+y
def sub(x, y):
return x-y
add_logger = logger(add)
sub_logger = logger(sub)
add_logger(3, 3)
add_logger(4, 5)
sub_logger(10, 5)
sub_logger(20, 10)
OUTPUT:
omkarpathak@omkarpathak-Inspiron-3542:
~/Documents/Python-Programs/$ python MoreOnClosures.py
6
9
5
10
Когда и зачем использовать замыкания:
1. Поскольку замыкания используются в качестве функций обратного вызова, они обеспечивают своего рода сокрытие данных. Это помогает нам сократить использование глобальных переменных.
2. Когда в нашем коде мало функций, замыкания оказываются эффективным способом. Но если нам нужно иметь много функций, тогда выбирайте класс (ООП).