„Python“ uždarymai: kaip jį naudoti ir kodėl?

Šioje pamokoje sužinosite apie „Python“ uždarymą, kaip apibrėžti uždarymą ir priežastis, dėl kurių turėtumėte jį naudoti.

Nešalinis kintamasis įdėtoje funkcijoje

Prieš pradėdami suprasti, kas yra uždarymas, pirmiausia turime suprasti, kas yra įdėta funkcija ir nejudrus kintamasis.

Kitos funkcijos viduje apibrėžta funkcija vadinama įdėta funkcija. Įterptosios funkcijos gali pasiekti pridedamos srities kintamuosius.

„Python“ šie ne vietiniai kintamieji pagal numatytuosius nustatymus yra tik skaitomi, todėl norėdami juos modifikuoti, turime juos aiškiai paskelbti kaip ne vietinius (naudodami vietinį raktinį žodį).

Toliau pateikiamas įterptosios funkcijos, pasiekiančios ne vietinį kintamąjį, pavyzdys.

 def print_msg(msg): # This is the outer enclosing function def printer(): # This is the nested function print(msg) printer() # We execute the function # Output: Hello print_msg("Hello")

Rezultatas

 Sveiki

Matome, kad įterptoji printer()funkcija galėjo pasiekti ne lokalinį uždarosios funkcijos msg kintamąjį.

Uždarymo funkcijos apibrėžimas

Ankstesniame pavyzdyje kas nutiktų, jei paskutinė funkcijos eilutė print_msg()grąžintų printer()funkciją, o ne ją vadintų? Tai reiškia, kad funkcija buvo apibrėžta taip:

 def print_msg(msg): # This is the outer enclosing function def printer(): # This is the nested function print(msg) return printer # returns the nested function # Now let's try calling this function. # Output: Hello another = print_msg("Hello") another()

Rezultatas

 Sveiki

Tai neįprasta.

print_msg()Funkcija buvo vadinama su virvele "Hello"ir grįžo funkcija buvo įpareigota pavadinimo kito. Paskambinus another()pranešimas vis tiek buvo prisimintas, nors mes jau baigėme vykdyti print_msg()funkciją.

Ši technika, pagal kurią kai kurie duomenys ( "Hellošiuo atveju) pridedami prie kodo , „Python“ vadinama uždarymu .

Ši pridedamo srities reikšmė atsimenama net tada, kai kintamasis išeina iš srities arba pati funkcija pašalinama iš dabartinės vardų srities.

Pabandykite paleisti šiuos duomenis „Python“ apvalkale, kad pamatytumėte išvestį.

 >>> del print_msg >>> another() Hello >>> print_msg("Hello") Traceback (most recent call last):… NameError: name 'print_msg' is not defined

Čia grąžinama funkcija vis tiek veikia, net kai pradinė funkcija buvo ištrinta.

Kada turime uždarymus?

Kaip matyti iš pirmiau pateikto pavyzdžio, mes turime „Python“ uždarymą, kai įdėta funkcija nurodo vertę savo uždaroje srityje.

Kriterijai, kurių reikia laikytis norint sukurti „Python“ uždarymą, apibendrinti toliau pateiktuose punktuose.

  • Turime turėti įdėtą funkciją (funkciją funkcijos viduje).
  • Įdėta funkcija turi būti susijusi su reikšme, apibrėžta uždarymo funkcijoje.
  • Uždarymo funkcija turi grąžinti įdėtą funkciją.

Kada naudoti uždarymus?

Taigi kam naudingi uždarymai?

Uždarius galima išvengti visuotinių verčių naudojimo ir suteikiama tam tikra duomenų slėpimo forma. Tai taip pat gali pateikti objektyvų problemos sprendimą.

Kai klasėje yra nedaug metodų (dažniausiai vienas metodas), uždarymai gali suteikti alternatyvų ir elegantiškesnį sprendimą. Bet kai atributų ir metodų skaičius padidėja, geriau įgyvendinti klasę.

Čia yra paprastas pavyzdys, kai uždarymas gali būti labiau vertinamas nei apibrėžiant klasę ir gaminant objektus. Tačiau pirmenybė teikiama jums.

 def make_multiplier_of(n): def multiplier(x): return x * n return multiplier # Multiplier of 3 times3 = make_multiplier_of(3) # Multiplier of 5 times5 = make_multiplier_of(5) # Output: 27 print(times3(9)) # Output: 15 print(times5(3)) # Output: 30 print(times5(times3(2)))

Rezultatas

 27 15 30

„Python“ dekoratoriai taip pat plačiai naudoja uždarymus.

Baigiamojoje pastaboje gerai pažymėti, kad vertes, kurios įtraukiamos į uždarymo funkciją, galima sužinoti.

Visi funkcijos objektai turi __closure__atributą, kuris pateikia langelio objektų paketą, jei tai yra uždarymo funkcija. Remdamiesi aukščiau pateiktu pavyzdžiu, mes žinome times3ir times5esame uždarymo funkcijos.

 >>> make_multiplier_of.__closure__ >>> times3.__closure__ (,)

Langelio objektas turi atributą cell_contents, kuriame saugoma uždara reikšmė.

 >>> times3.__closure__(0).cell_contents 3 >>> times5.__closure__(0).cell_contents 5

Įdomios straipsniai...