Что такое вложенная функция?
Вложенная функция — это функция, определенная внутри другой функции. Вложенные функции имеют доступ к объектам, определенным во внешней функции, но не могут их изменять (хотя это будет рассмотрено позже). Они часто используются для создания декораторов и замыканий (тема следующего урока). Главная особенность вложенных функций — возможность обращения к переменным внешней функции.
Пример вложенной функции
def myfun():
print("Внешняя функция")
def my_inner_fun():
print("Вложенная функция")
my_inner_fun()
print("Внешняя функция")
myfun()
Результат выполнения кода:
Внешняя функция Вложенная функция Внешняя функция
Обратите внимание: попытка вызвать my_inner_fun() вне функции myfun() приведет к ошибке NameError, так как my_inner_fun() является локальным объектом функции myfun() и не видна за ее пределами. Это связано с областью видимости: функция — это объект, имеющий свою область видимости.
Инкапсуляция
Вложенные функции часто используются для инкапсуляции – скрытия функции от глобальной области видимости. Это позволяет защитить функцию от внешнего воздействия.
Работа с параметрами и атрибутами
Вложенные функции могут работать с любыми объектами, определенными во внешней функции, а также с глобальными переменными.
Пример: функция, вычисляющая произведение чисел от 1 до n (при n > 15):
def myfun(n):
def my_inner_fun(n):
pr = 1
for i in range(1, n):
pr *= i
return pr
if n > 15:
return my_inner_fun(n)
else:
return "Число не подходит"
print(myfun(20)) # Выведет произведение
print(myfun(10)) # Выведет "Число не подходит"
В этом примере вложенная функция my_inner_fun использует параметр n внешней функции myfun, при этом параметр n не обязательно передавать явно в my_inner_fun. Вложенная функция может использовать переменные внешней функции, но внешняя функция не может использовать переменные, созданные во вложенной.
Оператор nonlocal
Оператор nonlocal позволяет изменять значения переменных из ближайшей области видимости (исключая глобальные).
Пример:
b = 10
def myfun():
b = 111
print(b)
def inner_fun():
nonlocal b
b = 333
print(b)
inner_fun()
print(b)
print(b)
myfun()
print(b)
В этом примере nonlocal b внутри inner_fun позволяет изменить значение переменной b во внешней функции myfun. Без nonlocal значение глобальной переменной b не изменится.
Оператор global
Оператор global позволяет переопределять глобальные переменные внутри функции.
Рекомендации
Избегайте чрезмерно глубокой вложенности функций, злоупотребления операторами global и nonlocal, а также использования одинаковых имен переменных в разных областях видимости. Если возможно, предпочитайте отдельные функции вложенным, что улучшит читаемость и удобство работы с кодом.