You are currently viewing Закрытие Python

Закрытие Python

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

Вложенные функции в 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!
  1. Как видно из приведенного выше кода, замыкания помогают вызывать функции, выходящие за их рамки.
  2. Функция Внутренняя функция имеет свою область применения только внутри внешней функции. Но с использованием замыканий мы можем легко расширить его область действия, чтобы вызвать функцию, выходящую за ее рамки.
# 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. Когда в нашем коде мало функций, замыкания оказываются эффективным способом. Но если нам нужно иметь много функций, тогда выбирайте класс (ООП).