все Python 3Функциипонятие
Замыкания
замыкания
Вложенная функция захватывает переменную из охватывающей области. Используется для фабрик функций и инкапсуляции состояния.
Синтаксис
def outer():
x = 10
def inner():
return x
return inner
Классическая ловушка: замыкание захватывает саму переменную, а не её значение в момент создания. Поэтому функции, созданные в цикле (lambda: i), все увидят последнее значение i — зафиксируйте его через аргумент по умолчанию (lambda i=i: i). А чтобы захваченную переменную не читать, а переприсваивать, во вложенной функции нужен nonlocal.
Примеры
def make_adder(n):
def adder(x):
return x + n
return adder
add5 = make_adder(5)
print(add5(3)) # → 8
def make_multiplier(factor):
def multiply(x):
return x * factor
return multiply
double = make_multiplier(2)
print(double(7)) # → 14
def counter():
count = 0
def inc():
nonlocal count
count += 1
return count
return inc
c = counter()
print(c(), c()) # → 1 2
def make_greeting(greeting):
def greet(name):
return f'{greeting}, {name}!'
return greet
hello = make_greeting('Hello')
print(hello('Bob')) # → Hello, Bob!
# Проверка замыкания
def outer():
x = 'closure'
def inner():
return x
return inner
f = outer()
print(f()) # → closure
# __closure__
def make_pow(n):
def power(x):
return x ** n
return power
p = make_pow(3)
print(p(2)) # → 8
print(p.__closure__[0].cell_contents) # → 3
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности