Python с нуля: Вложенные функции и замыкания

Рассмотрим вложенные функции и замыкания в Python, начав с областей видимости переменных.

Области видимости переменных

В Python существует четыре области видимости для переменных:

  1. Встроенная (Built-in): Содержит встроенные объекты, доступные при работе с Python (например, open, len, print). Доступ к ней можно получить, импортировав модуль builtins:
import builtins
print(dir(builtins))

Это выведет полный список встроенных имён.

  1. Глобальная (Global): Переменные, объявленные на уровне модуля (файла с расширением .py). Встроенные функции относятся к глобальной области видимости, но при импорте в другой модуль перестают быть глобальными для исходного. Пример:
y = 2

def degree(x):
  return y ** x

print(degree(4)) # Выведет 16
  1. Локальная (Local): Переменные, созданные и используемые внутри функции. После завершения работы функции, локальные переменные удаляются из памяти. Пример:
def degree(x):
  y = 2 # локальная переменная y
  return y ** x

print(degree(4)) # Выведет 16
print(y) # Вызовет ошибку NameError, так как y - локальная переменная
  1. Область видимости замыкания (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.

Что будем искать? Например,программа