Что такое замыкание
Python
Middle
Без компании
Что такое замыкание
Ответы
**Замыкание (closure)** — это функция, которая запоминает окружающее её состояние (переменные из внешней области видимости) на момент своего создания, даже если это состояние потом выходит из области видимости.
**Простыми словами:**
Это функция внутри другой функции, которая "запоминает" переменные из внешней функции и может использовать их позже, когда внешняя функция уже завершила работу.
**Ключевые элементы замыкания:**
**- Вложенная функция** (внутренняя).
**- Свободная переменная** (переменная из внешней области видимости, которую использует внутренняя функция).
**- Возврат внутренней функции** из внешней.
*Пример создания замыкания*
```
def outer_function(x): # 1. Внешняя функция
def inner_function(y): # 2. Внутренняя функция (замыкание)
return x + y # 3. Использует свободную переменную `x`
return inner_function # 4. Возвращаем внутреннюю функцию
# Создаем замыкание
closure = outer_function(10) # `x` = 10 "запоминается" в замыкании
# Теперь вызываем замыкание
result = closure(5) # = 10 + 5
print(result) # 15
```
```
#Пример - Фабрика функций
def multiplier(n):
# Замыкание запоминает множитель `n`
def multiply(x):
return x * n
return multiply
# Создаем специализированные функции
double = multiplier(2)
triple = multiplier(3)
print(double(5)) # 10 (5 * 2)
print(triple(5)) # 15 (5 * 3)
```
*Важный нюанс - Изменяемое состояние*
Если нужно изменять захваченную переменную, используйте ключевое слово `nonlocal`:
```
def counter():
count = 0
def increment():
nonlocal count # Указываем, что count - не локальная переменная
count += 1
return count
return increment
c = counter()
print(c()) # 1
print(c()) # 2 (состояние сохраняется между вызовами)
```
**Зачем нужны замыкания?**
**- Сохранение состояния** без использования классов.
**- Создание фабрик функций** с предустановленными параметрами.
**- Реализация декораторов** (декораторы в Python — это замыкания).
**- Инкапсуляция данных** и создание callback-функций.