Python nedleggelse

Python nedleggelse
I denne artikkelen skal vi diskutere Python -nedleggelse.Før vi forstår python-lukking, må vi forstå nestede funksjoner og ikke-lokale variabler.

Nestet funksjon:

En nestet funksjon er definert i en annen funksjon. Disse funksjonene kan få tilgang til en variabel av ytre funksjon. Den ikke-lokale variabelen vi kan få tilgang til innenfor deres omfang.

Eks:

defouter_fun (er):
msg = s #non lokal variabel
Definner_fun ():
Print (MSG)
indre_fun ()
ytre_fun ('god morgen')

Produksjon:

I eksemplet ovenfor er indre_fun en nestet funksjon, og MSG er en ikke-lokal variabel. Vi kan få tilgang til disse inne i det ytre_fun -kroppen.

Avslutningsdefinisjon:

Python -lukking er en nestet funksjon. Vi får tilgang til variabelen utenfor omfanget. Dette konseptet er viktig for å forstå python dekoratører.

Alle nestede funksjoner er ikke stenginger. Følgende tre kriterier skal møtes for å definere en nedleggelse:

  1. Vi bør ha en nestet funksjon (funksjon i en annen funksjon)
  2. Den nestede funksjonen skal referere til en variabel ikke -lokal til den
  3. Den ytre omfangsfunksjonen må returnere den indre funksjonen.

Eks:

#defining nestede funksjoner
defgreet_msg (er):
msg = s# msg har omfang i ytre funksjon
DEPPRINT_MSG ():
utskrift (MSG)#Bruke ikke -lokal variabel
returnprint_msg#return objekt i stedet for å ringe en indre funksjon
call_fun = hilsen_msg ('god morgen')
call_fun ()
call_fun ()

Produksjon:

I eksemplet ovenfor er hilsen_msg den ytre funksjonen. Dette skaper en indre funksjon (hilsen_msg er nedleggelse her), og den returneres.

Den ytre funksjonen hilsen_msg returnerer en print_msg -funksjon, og den er tilordnet call_fun -variabelen. Her ser vi den ytre funksjonen avsluttet utførelsen, men vi kan fremdeles få tilgang til MSG -variabelen.

Hvordan endre variabel inne i lukkingen:

Ved hjelp av ikke -lokal nøkkelord kan vi endre variabelen i den indre funksjonen.

Eks: Uten å bruke ikke -lokal nøkkelord. Her prøver vi å endre NUM -variabelen inne i lukking og fikk Unboundlocalerror fordi Python mener NUM som en lokal variabel og Num ikke er definert i moro ().

Defgenerate_num ():
num = 0
Deffun ():
num += 1
Print (Num)
returnerer moro
g = generere_num ()
g ()
g ()
g ()

Produksjon:

Eks: Med bruk ikke -lokal nøkkelord. I eksemplet nedenfor ved hjelp av ikke -lokal nøkkelord vil vi kunne endre NUM -variabelen.

Defgenerate_num ():
num = 0
Deffun ():
ikke -lokal num
num += 1
Print (Num)
returnerer moro
g = generere_num ()
g ()
g ()
g ()

Produksjon:

Vi vil skrive mer eksempel ved hjelp av en nedleggelse:

Eks: Dette vil skrive ut beståtte argumenter og funksjonsnavn

Defouter (func):
Defclosure (*args):
print ('Running "" med argumenter '.Format (func.__name__, args)))
Print (func (*args))
Returnering
Defadd (A, B):
Returna+b
Defsub (a, b):
Returner A-B
DEFMUL (A, B):
Returner en*B
Defdiv (A, B):
Returner A/B
add_closure = ytre (legg til)
sub_closure = ytre (sub)
mul_closure = ytre (mul)
div_closure = ytre (div)
add_closure (3, 3)
add_closure (4, 5)
sub_closure (10, 5)
sub_closure (20, 10)
mul_closure (10, 5)
mul_closure (20, 10)
Div_closure (10, 5)
Div_closure (20, 10)

Produksjon:

Eks: I eksemplet nedenfor, hver gang nedleggelsen kalles, vil verdiene legges til en liste, og den vil legge til alle verdiene i listen og deretter returnere en verdi.

Defaddition ():
res = []
deffunc_sum (val):
res.vedlegg (val)
sum_res = sum (res)
Returnsum_res
returnfunc_sum
s = tillegg ()
t = S (2)
trykk (t)
t = S (5)
trykk (t)
T = S (10)
trykk (t)
t = S (100)
trykk (t)

Produksjon:

Eks: I dette eksemplet multipliserer det indre funksjonsparameternummeret med ytre funksjonsparameter
def multiply_by_number (m):

# indre funksjon
Defoperasjon (n):
# m multipliseres med n
return n * m
# Returner indre funksjon
Returoperasjon
multiply_by_10 = multiply_by_number (10)
# Bør skrive ut 20
print (multiply_by_10 (2))
# Bør skrive ut 100
print (multiply_by_10 (10))
# Bør skrive ut 120
print (multiply_by_10 (12))

Produksjon:

Konklusjon:

Python -lukking er en nestet funksjon. Med dette kan vi unngå å bruke globale variabler ved bruk av ikke-lokale variabler. Dette gir noen data som skjuler og forstår dette konseptet nyttig i å bygge en Python -dekoratør.