Вкладені функції в Python

Вкладена функція - це просто функція в межах іншої функції, яку іноді називають "внутрішньою функцією". Є багато причин, чому ви хотіли б використовувати вкладені функції, і ми розглянемо найпоширеніші в цій статті.

Як визначити вкладену функцію

Щоб визначити вкладену функцію, просто ініціалізуйте іншу функцію всередині функції, використовуючи defключове слово:

def greeting(first, last): # nested helper function def getFullName(): return first + " " + last print("Hi, " + getFullName() + "!") greeting('Quincy', 'Larson')

Вихід:

Hi, Quincy Larson!

Як бачите, вкладена getFullNameфункція має доступ до параметрів зовнішньої greetingфункції firstта last. Це звичайний випадок використання вкладених функцій - щоб він служив невеликою допоміжною функцією для більш складної зовнішньої функції.

Причини використання вкладених функцій

Хоча існує багато вагомих причин використовувати вкладені функції, серед найпоширеніших є інкапсуляція та закриття / заводські функції.

Інкапсуляція даних

Бувають випадки, коли ви хочете запобігти доступу функції або даних, до яких вона має доступ, з інших частин коду, тому ви можете інкапсулювати її в іншу функцію.

Коли ви вкладаєте таку функцію, вона прихована від глобальної області дії. Через таку поведінку інкапсуляцію даних іноді називають приховуванням даних або конфіденційністю даних . Наприклад:

def outer(): print("I'm the outer function.") def inner(): print("And I'm the inner function.") inner() inner()

Вихід:

Traceback (most recent call last): File "main.py", line 16, in  inner() NameError: name 'inner' is not defined

У наведеному вище коді innerфункція доступна лише зсередини функції outer. Якщо ви спробуєте зателефонувати innerза межами функції, ви отримаєте помилку вище.

Натомість ви повинні викликати outerфункцію так:

def outer(): print("I'm the outer function.") def inner(): print("And I'm the inner function.") inner() outer()

Вихід:

I'm the outer function. And I'm the inner function.

Закриття

Але що станеться, якщо зовнішня функція поверне саму внутрішню функцію, а не викликатиме її, як у прикладі вище? У такому випадку у вас буде те, що відоме як закриття.

Нижче наведено умови, які потрібно виконати, щоб створити закриття в Python:

Ось умови, необхідні для створення закриття в Python:

1. Повинна бути вкладена функція

2. Внутрішня функція повинна посилатися на значення, яке визначено в області, що вкладається

3. Функція вкладання має повернути вкладену функцію

- Джерело: //stackabuse.com/python-nested-functions/

Ось простий приклад закриття:

def num1(x): def num2(y): return x + y return num2 print(num1(10)(5))

Вихід:

15

Закриття дозволяють передавати дані внутрішнім функціям без попередньої передачі їх зовнішнім функціям з параметрами, як greetingприклад на початку статті. Вони також дозволяють викликати внутрішню функцію ззовні інкапсулюючої зовнішньої функції. Все це з перевагою інкапсуляції / приховування даних, згаданих раніше.

Тепер, коли ви розумієте, як і навіщо вкладати функції в Python, вийдіть і вкладіть їх із найкращими з них.