Как в Python вернуть функцию из другой функции?

«Как в Python вернуть функцию из другой функции?» — вопрос из категории Python, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Эта возможность лежит в основе таких мощных концепций, как замыкания и декораторы.

Пример: Фабрика функций

def create_multiplier(factor):
    """Эта функция создает и возвращает новую функцию."""
    def multiplier(number):
        """Эта функция умножает свой аргумент на 'захваченный' factor."""
        return number * factor

    return multiplier

# Создаем функцию, которая будет умножать на 2
double = create_multiplier(2)

# Создаем функцию, которая будет умножать на 3
triple = create_multiplier(3)

print(f"Double 5: {double(5)}")  # Вывод: Double 5: 10
print(f"Triple 5: {triple(5)}")  # Вывод: Triple 5: 15

Почему это работает?

Внутренняя функция multiplier "захватывает" переменную factor из своего внешнего лексического окружения. Этот механизм называется замыканием (closure). Даже после того, как create_multiplier завершила свою работу, возвращенная функция multiplier все еще помнит значение factor, с которым она была создана.