Как вернуть функцию из функции?

В Python функция может возвращаться как любой другой объект. Вот пример:

def outer_function():
  def inner_function(x):
    return x * 2
  return inner_function

my_func = outer_function()
result = my_func(5) # result будет равен 10
  
Функция outer_function возвращает inner_function. Затем возвращенная функция может быть вызвана как my_func(5).

Да, в Python функции являются объектами первого класса (first-class citizens). Это означает, что функции можно передавать как аргументы другим функциям, возвращать из функций, и присваивать переменным.

Как вернуть функцию из функции:


def outer_function(message):
  """Внешняя функция, принимающая сообщение."""

  def inner_function():
    """Внутренняя функция, использующая сообщение из внешней функции."""
    print(message)

  return inner_function  # Возвращаем внутреннюю функцию (не вызываем ее!)

# Пример использования:
my_function = outer_function("Привет, мир!")  # Получаем inner_function
my_function()  # Вызываем inner_function, которая печатает "Привет, мир!"
  

Объяснение:

  • outer_function принимает аргумент message.
  • Внутри outer_function определена inner_function, которая замыкается (closure) на переменную message из области видимости outer_function. Это значит, что даже после того, как outer_function завершит свою работу, inner_function сохранит доступ к значению message.
  • outer_function возвращает inner_function без ее вызова (обратите внимание на отсутствие скобок () после inner_function в операторе return).
  • Когда мы присваиваем результат outer_function("Привет, мир!") переменной my_function, my_function становится ссылкой на inner_function.
  • Когда мы вызываем my_function(), мы фактически вызываем inner_function, которая, благодаря замыканию, печатает значение message, которое было передано в outer_function при ее вызове.

Почему это полезно?

  • Замыкания: Возможность создания функций, которые "помнят" состояние из области видимости, в которой они были определены. Это очень полезно, например, для создания фабрик функций или для реализации декораторов.
  • Создание параметризованных функций: Можно создавать функции, которые имеют разные параметры по умолчанию, в зависимости от аргументов, переданных во внешнюю функцию.
  • Инструмент для функционального программирования: Функции первого класса позволяют использовать Python в стиле функционального программирования.
0