Закрытие


Замыкание - это функциональный объект, который запоминает значения в охватывающих областях, даже если они не присутствуют в памяти. Давайте перейдем к этому шаг за шагом

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

Например:

def transmit_to_space(message): "This is the enclosing function" def data_transmitter(): "The nested function" print(message) data_transmitter() print(transmit_to_space("Test message"))
1
2
3
4
5
6
7
8
9
def transfer_to_space ( сообщение ) :
«Это закрывающая функция»
def data_transmitter ( ) :
«Вложенная функция»
печать ( сообщение )
data_transmitter ( )
print ( transfer_to_space ( "Тестовое сообщение" ))
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
В 1]:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1/0 0/0

Это работает хорошо, поскольку функция data_transmitter может получить доступ к сообщению. Чтобы продемонстрировать использование ключевого слова "нелокальный", рассмотрим это

def print_msg(number): def printer(): "Here we are using the nonlocal keyword" nonlocal number number=3 print(number) printer() print(number) print_msg(9)
1
2
3
4
5
6
def print_msg ( число ) :
def printer ( ) :
«Здесь мы используем нелокальное ключевое слово»
нелокальный номер
число = 3
печать ( число )
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
В 1]:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1/0 0/0

Без ключевого слова nonlocal вывод будет «3 9», однако с его использованием мы получим «3 3», то есть значение переменной «number» будет изменено.

Теперь, как насчет того, чтобы мы вернули объект функции, а не вызывали вложенную функцию внутри него. (Помните, что даже функции являются объектами (это Python.))

def transmit_to_space(message): "This is the enclosing function" def data_transmitter(): "The nested function" print(message) return data_transmitter
1
2
3
4
5
6
def transfer_to_space ( сообщение ) :
«Это закрывающая функция»
def data_transmitter ( ) :
«Вложенная функция»
печать ( сообщение )
вернуть data_transmitter
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
В 1]:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1/0 0/0

И вызываем функцию следующим образом:

def transmit_to_space(message): "This is the enclosing function" def data_transmitter(): "The nested function" print(message) return data_transmitter fun2 = transmit_to_space("Burn the Sun!") fun2()
1
2
3
4
5
6
7
8
9
def transfer_to_space ( сообщение ) :
«Это закрывающая функция»
def data_transmitter ( ) :
«Вложенная функция»
печать ( сообщение )
вернуть data_transmitter
fun2 = transmit_to_space ( "Ожог солнце!" )
fun2 ( )
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
В 1]:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1/0 0/0

Даже несмотря на то, что выполнение «transfer_to_space ()» было завершено, сообщение скорее сохранилось. Этот метод, с помощью которого данные прикрепляются к некоторому коду даже после завершения этих других исходных функций, называется закрытием в python.

ПРЕИМУЩЕСТВО: замыкания позволяют избежать использования глобальных переменных и обеспечивают некоторую форму сокрытия данных (например, когда в классе мало методов, используйте замыкания).

Кроме того, декораторы в Python широко используют замыкания.

Упражнение

Создайте вложенный цикл и закрытие Python, чтобы функции получали несколько функций умножения с помощью замыканий. То есть, используя замыкания, можно создать функции для создания функций multiply_with_5 () или multiply_with_4 () с использованием замыканий.