Замыкания
@ProgHelpBotЗамыкание
Представляет функцию, которая запоминает свое лексическое окружение даже в том случае, когда она выполняется вне своей области видимости. Включает в себя три компонента:
- Внешняя функция, которая определяет некоторую область видимости и в которой определены некоторые переменные и параметры;
- Переменные и параметры (лексическое окружение), которые определены во внешней функции;
- Вложенная функция, которая использует переменные и параметры внешней функции.
Для определения замыкания применяются локальные функции.
def outer(): # внешняя функция
n = 5 # лексическое окружение
def inner(): # вложенная функция
nonlocal n
n += 1 # операции с лексическим окружением
return n
return inner # внешняя функция возвращает вложенную
fn = outer() # fn = inner(), т.к. outer() возвращает inner()
print(fn()) # 6
print(fn()) # 7
print(fn()) # 8
Применение параметров
Кроме внешних переменных к лексическому окружению также относятся параметры окружающей функции.
def multiply(n):
def inner(m):
return n * m
return inner
fn = multiply(5)
print(fn(5)) # 25
print(fn(6)) # 30
print(fn(7)) # 35
Этот код можно сократить с помощью лямбд.
def multiply(n): return lambda(m): n * m fn = multiply(5) print(fn(5)) # 25 print(fn(6)) # 30 print(fn(7)) # 35