Рассмотрим вложенные функции и замыкания в Python, начав с областей видимости переменных.
Области видимости переменных
В Python существует четыре области видимости для переменных:
- Встроенная (Built-in): Содержит встроенные объекты, доступные при работе с Python (например, open, len, print). Доступ к ней можно получить, импортировав модуль builtins:
import builtins
print(dir(builtins))
Это выведет полный список встроенных имён.
- Глобальная (Global): Переменные, объявленные на уровне модуля (файла с расширением .py). Встроенные функции относятся к глобальной области видимости, но при импорте в другой модуль перестают быть глобальными для исходного. Пример:
y = 2
def degree(x):
return y ** x
print(degree(4)) # Выведет 16
- Локальная (Local): Переменные, созданные и используемые внутри функции. После завершения работы функции, локальные переменные удаляются из памяти. Пример:
def degree(x):
y = 2 # локальная переменная y
return y ** x
print(degree(4)) # Выведет 16
print(y) # Вызовет ошибку NameError, так как y - локальная переменная
- Область видимости замыкания (Enclosing): Локальные переменные внешней функции, доступные для вложенных функций.
Вложенные функции
Вложенные функции — функции, определённые внутри других функций. Они имеют прямой доступ к переменным, определённым во внешней функции:
def degree(x):
y = 2
def inner_degree():
return y ** x
return inner_degree()
print(degree(4)) # Выведет 16
Вложенные функции используются для:
- Инкапсуляции: Скрытия данных и функций от внешнего доступа. Пример:
def s_p(num):
def v_print():
return str(num) + " processed"
return v_print()
print(s_p(78)) # Выведет "78 processed"
# print(v_print) # Вызовет ошибку NameError, так как v_print - локальная функция
- Создание замыканий и декораторов.
Замыкания
Замыкание — функция, которая «запоминает» своё состояние, даже после завершения работы внешней функции. Это происходит благодаря сохранению ссылки на локальные переменные внешней функции. Пример:
def make_multiplier(x):
def multiplier(y):
return x * y
return multiplier
mult_4 = make_multiplier(4)
print(mult_4(5)) # Выведет 20
print(mult_4(10)) # Выведет 40
Здесь mult_4 — замыкание, сохраняющее значение x = 4.
Замыкания позволяют избежать использования глобальных переменных и обеспечивают инкапсуляцию. В объектно-ориентированном программировании замыкания часто заменяются классами, но для небольших функций они являются более лаконичным решением.
Вложенные функции и замыкания — мощные инструменты в Python, позволяющие создавать более структурированный и элегантный код, обеспечивая инкапсуляцию и сохранение состояния. Понимание этих концепций — важный шаг в освоении Python.