Zamknięcie Pythona

Zamknięcie Pythona
W tym artykule omówimy zamknięcie Pythona.Przed zrozumieniem zamknięcia Pythona musimy zrozumieć funkcje zagnieżdżone i zmienne nielokalne.

Funkcja zagnieżdżona:

Funkcja zagnieżdżona jest zdefiniowana w innej funkcji. Funkcje te mogą uzyskać dostęp do zmiennej funkcji zewnętrznej. Zmienna nielokalna, do której można uzyskać dostęp w ramach ich zakresu.

Były:

defouter_fun (S):
msg = s #non zmienna lokalna
definner_fun ():
Drukuj (MSG)
inner_fun ()
zewnętrzny_fun („dzień dobry”)

Wyjście:

W powyższym przykładzie inner_fun jest funkcją zagnieżdżoną, a MSG jest zmienną nielokalną. Możemy uzyskać do nich dostęp do ciała zewnętrznego.

Definicja zamknięcia:

Zamknięcie Pythona jest funkcją zagnieżdżoną. Możemy uzyskać dostęp do zmiennej poza zakresem. Ta koncepcja jest niezbędna do zrozumienia dekoratorów Pythona.

Wszystkie zagnieżdżone funkcje nie są zamknięciami. Poniższe trzy kryteria powinny się spełnić, aby zdefiniować zamknięcie:

  1. Powinniśmy mieć funkcję zagnieżdżoną (funkcja w innej funkcji)
  2. Funkcja zagnieżdżona powinna odnosić się do zmiennej nielokalnej
  3. Funkcja zakresu zewnętrznego musi zwrócić funkcję wewnętrzną.

Były:

#definiowanie funkcji zagnieżdżonych
defgreet_msg (s):
msg = s# msg ma zakres w funkcji zewnętrznej
defrint_msg ():
wydruku
returnprint_msg#Zwracaj obiekt zamiast wywoływania funkcji wewnętrznej
call_fun = freet_msg („dzień dobry”)
call_fun ()
call_fun ()

Wyjście:

W powyższym przykładzie freet_msg jest funkcją zewnętrzną. Stwarza to funkcję wewnętrzną (tu jest tutaj zamknięcie) i jest zwracana.

Funkcja zewnętrzna Greet_msg Zwraca funkcję print_msg i jest przypisana do zmiennej Call_Fun. Tutaj widzimy, że funkcja zewnętrzna zakończyła jej wykonanie, ale nadal możemy uzyskać dostęp do zmiennej MSG.

Jak zmodyfikować zmienną wewnątrz zamknięcia:

Za pomocą nielokalnego słowa kluczowego możemy zmodyfikować zmienną wewnątrz funkcji wewnętrznej.

Były: Bez użycia nielokalnego słowa kluczowego. Tutaj staramy się zmodyfikować zmienną NUM wewnątrz zamknięcia i otrzymujemy UnboundLocalerRor, ponieważ Python uważa, że ​​NUM za zmienną lokalną, a NUM nie jest zdefiniowany w FUN ().

defgeniate_num ():
num = 0
deffun ():
Num += 1
druk (num)
Zwróć zabawę
g = generate_num ()
G()
G()
G()

Wyjście:

Były: Z użyciem nielokalne Słowo kluczowe. W poniższym przykładzie za pomocą nielokalnego słowa kluczowego będziemy w stanie zmodyfikować zmienną NUM.

defgeniate_num ():
num = 0
deffun ():
Num
Num += 1
druk (num)
Zwróć zabawę
g = generate_num ()
G()
G()
G()

Wyjście:

Napiszemy więcej przykładu za pomocą zamknięcia:

Były: To wydrukuje przekazane argumenty i nazwa funkcji

Defouteter (FUNC):
Dokonanie (*args):
print („uruchamianie” ”z argumentami '.Format (FUNC.__name__, args))
print (func (*args))
Zamknięcie powrotu
defadd (a, b):
Returda+b
Defsub (A, B):
zwrot a-b
DEFMUL (A, B):
zwróć*B
defdiv (a, b):
Zwrot A/B
add_cluose = zewnętrzny (add)
Sub_Cluose = zewnętrzny (sub)
MUL_COCOUTER = zewnętrzny (MUL)
div_cluose = zewnętrzny (div)
add_cluose (3, 3)
add_cluose (4, 5)
Sub_COUBOUS (10, 5)
Sub_Conosure (20, 10)
MUL_COUTOUT (10, 5)
MUL_COCOUTER (20, 10)
Div_Cocose (10, 5)
DIV_COCOUTER (20, 10)

Wyjście:

Były: W poniższym przykładzie za każdym razem, gdy wywołanie zostanie wywoływane, wartości będą dołączane do listy i dodają wszystkie wartości na liście, a następnie zwróci wartość.

defaddition ():
res = []
deffunc_sum (val):
res.Dodatek (val)
sum_res = sum (res)
returnsum_res
returnfunc_sum
s = dodatek ()
t = s (2)
Drukuj (t)
t = s (5)
Drukuj (t)
t = s (10)
Drukuj (t)
t = s (100)
Drukuj (t)

Wyjście:

Były: W tym przykładzie pomnóż numer parametru funkcji wewnętrznej według parametru funkcji zewnętrznej
def multiply_by_number (m):

# Funkcja wewnętrzna
Defoperation (n):
# m jest mnożony przez n
powrót n * m
# Zwróć funkcję wewnętrzną
Operacja powrotu
multiply_by_10 = multiply_by_number (10)
# powinien wydrukować 20
print (multiply_by_10 (2))
# powinien wydrukować 100
print (multiply_by_10 (10))
# powinien wydrukować 120
print (multiply_by_10 (12))

Wyjście:

Wniosek:

Zamknięcie Pythona jest funkcją zagnieżdżoną. Dzięki temu możemy uniknąć stosowania zmiennych globalnych za pomocą zmiennych nielokalnych. Zapewnia to ukrywanie danych i zrozumienie tej koncepcji pomocne w budowaniu dekoratora Pythona.