Вложенные функции в Python

Функция - это блок кода, который можно вызывать снова и снова в программе. Он может принимать разные аргументы и может возвращать какое-то полезное значение. Во всех языках программирования у нас есть встроенные функции и пользовательские функции.

В этом руководстве мы узнаем, как создавать и использовать вложенные функции в Python.

Большинство языков поддерживают использование и создание вложенных функций. Как следует из названия, вложенная функция - это функция внутри функции. Вложенная внутрь функция называется внутренней функцией, а включающая функция - внешней функцией.

В следующем коде мы создаем базовую вложенную функцию.

def outer_f(s):
    def inner_f(s):
        print(s)
    inner_f(s)    
outer_f("Nested")        

Выход:

Nested

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

Еще нужно знать, что вложенная функция может использовать переменную, используемую во внешней функции. Такие переменные называются нелокальными. Вложенные функции могут получить к ним доступ, но если нам нужно их изменить, мы должны использовать ключевое слово nonlocal.

Посмотрим на следующий пример.

def outer_f():
    s = 5
    def inner_f():
        nonlocal s
        s =  s+1
        return s
    return inner_f()    

print(outer_f())        

Выход:

6

Здесь мы не сможем изменить переменную s без использования ключевого слова nonlocal.

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

См. Следующий код.

def incrementer(x):
    def inc(y):
        return x + y
    return inc

by4 = incrementer(4)
by5 = incrementer(5)

print(by4(5), by5(5))

Выход:

9 10

Теперь в приведенном выше коде мы создаем динамический метод для увеличения числа. by4 и by5 - две закрывающие функции, созданные с помощью вложенной функции. В основном это связано со способностью вложенных функций сохранять свое состояние. Это может быть достойной альтернативой классам и глобальным переменным, когда задействовано не слишком много атрибутов. Узнать, является ли функция замыканием, можно с помощью атрибута __closure__. Все функции имеют этот атрибут, и он возвращает некоторые объекты ячеек при использовании с функцией закрытия.

Вложенные функции также используются для функций декоратора. Функции декоратора используют вызываемый объект, например класс, функцию, и возвращают другой объект. Мы используем знак @, чтобы использовать декоратор перед любым таким вызываемым объектом. Таким образом, мы берем вызываемый объект в качестве аргумента функции декоратора и используем его.

Мы создаем очень простую функцию-декоратор, чтобы лучше понять это в следующем примере.

def dec(func):
    def inner():
        print("Hello")
        func()
    return inner

@dec
def world():
    print("world")

world()

Выход:

Hello
world

В приведенном выше примере мы создали простую функцию-декоратор под названием dec(), которая украшает функцию world(), используя ее в качестве аргумента и выводя дополнительное сообщение.

Сопутствующая статья - Python Function

  • Перегрузка функций в Python
  • Передача по ссылке в Python
  • Функция обратного вызова в Python