O funcție imbricată este pur și simplu o funcție din cadrul altei funcții și este uneori numită „funcție interioară”. Există multe motive pentru care ați dori să utilizați funcții imbricate și vom trece peste cele mai frecvente din acest articol.

Cum se definește o funcție imbricată

Pentru a defini o funcție imbricată, inițializați o altă funcție într-o funcție utilizând def cuvânt cheie:

def greeting(first, last):
  # nested helper function
  def getFullName():
    return first + " " + last

  print("Hi, " + getFullName() + "!")

greeting('Quincy', 'Larson')

Ieșire:

Hi, Quincy Larson!

După cum puteți vedea, cel cuibărit getFullName funcția are acces la exterior greeting parametrii funcției, first și last. Acesta este un caz de utilizare obișnuit pentru funcțiile imbricate – pentru a servi ca funcție de ajutor mic la o funcție exterioară mai complexă.

Motive pentru utilizarea funcțiilor imbricate

Deși există multe motive valide pentru a utiliza funcțiile imbricate, printre cele mai frecvente se numără încapsularea și închiderea / funcțiile din fabrică.

Incapsularea datelor

Există momente în care doriți să împiedicați accesarea unei funcții sau a datelor la care are acces din alte părți ale codului dvs., astfel încât să puteți încapsula în cadrul unei alte funcții.

Când cuibăriți o astfel de funcție, aceasta este ascunsă din domeniul de aplicare global. Datorită acestui comportament, încapsularea datelor este uneori denumită ascunderea datelor sau confidențialitatea datelor. De exemplu:

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

inner()

Ieșire:

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

În codul de mai sus, inner funcția este disponibilă numai din interiorul funcției outer. Dacă încercați să sunați inner din afara funcției, veți primi eroarea de mai sus.

În schimb, trebuie să apelați outer funcționează așa:

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

outer()

Ieșire:

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

Închideri

Dar ce s-ar întâmpla dacă funcția exterioară returnează însăși funcția interioară, mai degrabă decât să o numim ca în exemplul de mai sus? În acest caz, veți avea ceea ce se numește închidere.

Următoarele sunt condițiile care trebuie îndeplinite pentru a crea o închidere în Python:

Iată condițiile de care aveți nevoie pentru a crea o închidere în Python:

1. Trebuie să existe o funcție imbricată

2. Funcția interioară trebuie să se refere la o valoare care este definită în domeniul de aplicare al anexei

3. Funcția de închidere trebuie să returneze funcția imbricată

– Sursă: https://stackabuse.com/python-nested-functions/

Iată un exemplu simplu de închidere:

def num1(x):
  def num2(y):
    return x + y
  return num2

print(num1(10)(5))

Ieșire:

15

Închiderile fac posibilă trecerea datelor către funcțiile interioare fără a le transmite mai întâi către funcțiile externe cu parametri precum greeting exemplu la începutul articolului. De asemenea, fac posibilă invocarea funcției interioare din exteriorul funcției externe de încapsulare. Toate acestea cu beneficiul încapsulării / ascunderii datelor menționate anterior.

Acum că înțelegeți cum și de ce să cuibăriți funcțiile în Python, ieșiți și cuibăriți-le cu cele mai bune dintre ele.