Вложената функция е просто функция в рамките на друга функция и понякога се нарича "вътрешна функция". Има много причини, поради които бихте искали да използвате вложени функции, и ще разгледаме най-често срещаните в тази статия.
Как да дефинирам вложена функция
За да дефинирате вложена функция, просто инициализирайте друга функция във функцията, като използвате 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, излезте и ги загнездете с най-доброто от тях.