Zamknięcia Pythona

Zamknięcia Pythona
Musimy zrozumieć zagnieżdżone funkcje i zmienne nielokalne, zanim zrozumiemy, czym jest zamknięcie Pythona.

Funkcje napisane w Pythonie są uważane za obiekty pierwszej klasy. Równoważny status innych obiektów jest podawany funkcjom w Pythonie. Funkcje mogą być tworzone i niszczone dynamicznie, przypisane do zmiennych, zapisywane w kolekcjach, dostarczane jako argumenty i więcej. Termin „funkcje zagnieżdżone”, czasem znane jako „funkcje wewnętrzne”, odnosi się do funkcji zdefiniowanych w innych funkcjach.


Jest to zagnieżdżona funkcja zwana komunikatem kompilacji. Jego zewnętrzna główna funkcja to miejsce, w którym jest zdefiniowana i wywoływana.

W najbardziej podstawowej formie zamknięcie jest tylko zagnieżdżoną funkcją, która ma dostęp do zmiennej swobodnej pozostawionej po zakończeniu wykonania funkcji otaczającej. Zamknięcie Pythona ma te trzy nieruchomości:

    • Jest zagnieżdżony w funkcji.
    • Może uzyskać dostęp do bezpłatnej zmiennej poza jej zakresem.
    • Zwraca ją otaczająca funkcja.

Mówi się, że każda zmienna, która jest niezwiązana z zakresu lokalnego. Nielokalne słowo kluczowe jest wymagane do funkcjonowania zamknięć za pomocą niezmiennych zmiennych, takich jak ciągi i liczby całkowite. Zamknięcia Pythona oferują pewne maskowanie danych i pomagać w unikaniu używania zmiennych globalnych.

Zakres zmiennych

Musimy również dowiedzieć się o zakresie zmiennej Pythona, aby pełniej zrozumieć zamknięcia. Zakres jest taki region, w którym zmienna jest obserwowana. Można zastosować tylko określony zakres zmiennej. Zgodnie z trzema różnymi zakresem zmienne można często przydzielić w trzech oddzielnych lokalizacjach:

    • Zakres globalny: Definicja zmiennej, gdy jest ona poza wszystkimi funkcjami. Każda funkcja w kodzie może łatwo wykorzystać zmienną globalną.
    • Lokalny zakres: Zmienna jest lokalna dla funkcji, gdy jest w niej zadeklarowana. Do zmiennej lokalnej można uzyskać tylko z wewnątrz granic takiej funkcji, w której jest zadeklarowana.
    • Zakres nielokalny: Zmienna przydzielona jest nielokalna dla swoich zagnieżdżonych funkcji, gdy jest używana w funkcji otaczającej. Funkcja, w której zdefiniowano zmienną nielokalną, a także wszystkie jej wewnętrzne funkcje, mogą uzyskać dostęp do tej zmiennej.

Dlaczego warto używać zamknięć?

Kluczowe powody, dla których zatrudniamy dekoratorów, są przedstawione na poniższej liście:

    • Fakt, że zamknięcia Pythona oferują jakąś formę maskowania danych jako funkcji oddzwonienia, jest jedną z kluczowych korzyści z ich zatrudnienia. W konsekwencji wykorzystanie zmiennych globalnych jest zmniejszone
    • Rozmiar kodu można zmniejszyć w niektórych okolicznościach, wykorzystując zamknięcia, a nie klasy.
    • Podczas zastępowania stałych stałych zamknięcia są doskonałym wyborem.
    • Dekoracyjna funkcja zamknięć jest bardzo korzystna.

Kiedy Python tworzy zamknięcie?

Python tworzy nowy zakres za każdym razem, gdy wywoływana jest funkcja. Python dodatkowo wytwarza nowe zamknięcie, jeśli ta funkcja produkuje jedną.


Utwórz funkcję o nazwie mnożnik, która najpierw tworzy zamknięcie. Mnożenie dwóch wejść jest tym, co zwraca funkcja mnożnika. Ale wykorzystuje zamknięcie zamiast tego. Dodaj trzy połączenia do funkcji mnożnika. Wywołane są trzy zamknięcia, wywołując te funkcje. Liczba jest mnożona przez 2, 4 i 5 przez każdą funkcję. Następnie uruchom funkcje zamknięć.

Przykład 1:

Aby wywołać wewnętrzną funkcję spoza funkcji zewnętrznej, musimy najpierw dowiedzieć się, jak. Te metody mogą zwrócić wartość. Tutaj „t” i „u” są lokalnymi zmiennymi funkcji f ().


Ponieważ zmienne „t” i „u” nie można już uzyskać po uruchomieniu h = f (), wszystkie zmienne F (lokalne) zniknęły. Jednak nadal zachowujemy wartość „t”, która została zwrócona i zapisana w H. Możemy w ten sposób być w stanie sprawić, by funkcja zewnętrzna zwróciła funkcję wewnętrzną. Funkcje pierwszej klasy Pythona sprawiają, że jest to możliwe. Oznacza to, że ponieważ Python interpretuje funkcje jako wartości, możesz przypisać je do zmiennych, podać je jako argumenty funkcyjne lub sprawić, że inna funkcja zwróci.

Przykład 2:

Ten przykład pokazuje, że funkcja wewnętrzna „g” jest zwracana przez funkcję zewnętrzną f (t).


Funkcja g () jest teraz zwracana przez wyrażenie f (t). Przypisując wartość „g” do „h”, kiedy piszemy h = f (i), „h” można teraz uznać za „g” i przyjmować argument G. H (j) jest równoważne z wywoływaniem „g” w rezultacie (j).

Przykład 3:

Funkcja g (), a nie szczególna wartość tego, jest to, co zwraca F (t). Weź pod uwagę ten przypadek i napisz następujące:


Ten kod zwraca błąd. Oznacza to, że napotkaliśmy błąd. Nie możemy użyć „h” do wywołania funkcji, ponieważ zwracamy wynik g (u) z f (t), co jest przyczyną błędu.

Przykład 4:

Nie musimy trzymać f (a) w „h”. Alternatywą jest wywołanie bezpośrednio F (a) (b). Rozważ następującą ilustrację:


Potrzeba zmiany między F (a, b) i f (a) należy zawsze pamiętać (b). Wymaga dwóch parametrów, aby wywołać funkcję F (a, b). Z drugiej strony funkcja f (a) (b) jest serią zagnieżdżonych funkcji, z których każda akceptuje tylko jedno wejście. Znany jako funkcja nieusowa, ten typ funkcji akceptuje tylko jedno wejście. W konsekwencji F (a) (b) jest serią dwóch zagnieżdżonych funkcji nierównych. Tak więc F (a) jest najpierw oceniany. Aby połączyć te funkcje razem, F (a) powinien zwrócić funkcję. Tutaj zwraca funkcję wewnętrzną „G”. W konsekwencji F (a) (b) = g (b).

Przykład 5:

Zastosowanie dłuższej serii funkcji nierównych jest po prostu możliwe poprzez rozszerzenie bieżącego podejścia. W tym przypadku można również zobaczyć trzy zagnieżdżone funkcje Unary. Pierwsza funkcja, f (t), ma w sobie funkcję zwaną g (u), a g (u) ma w niej funkcję zwaną h (v). Każda funkcja wewnętrzna jest zwracana przez jego funkcję zewnętrzną.


Tutaj definiujemy funkcje. Te funkcje zwracają wartości. Następnie inicjowanie trzech zmiennych i przypisujemy im trzy różne liczby całkowite. Następnie nazywamy te zmienne atrybuty funkcji.

Przykład 6:

Załóżmy, że istnieją pewne zmienne nielokalne w funkcji zewnętrznej. Zobaczmy co się stanie.


Uruchamianie pokazuje, że działa bez zaczepu i że G (U) ma dostęp zarówno do „T”, jak i „V”. Jednak w jaki sposób jest to nawet możliwe? Teraz, gdy jesteśmy poza widokiem F (t) F, więc „T” i „V” nie powinny być osiągalne po wykonaniu F (t). Dlaczego G (u) nadal jest w stanie uzyskać do nich dostęp? To dlatego, że g (u), funkcja wewnętrzna, jest teraz zamknięciem.

Przykład 7:

Zmodyfikujmy funkcję wewnętrzną używaną w tym przypadku.


Jeśli tak się stanie, nie można już powiedzieć, że jest to zamknięcie. Wyjaśnienie jest takie, że G (u) nie uzyskuje dostępu do zmiennych nielokalnych „T” i „V”. Stąd g (u) nie jest zobowiązane do ich rejestrowania.

Przykład 8:

W tym przypadku zobaczymy, czy ustawimy wartości dwóch parametrów funkcji równych, wówczas funkcja ta jest ustawiona na zamknięcie, czy nie.


Jeszcze raz „t” jest potrzebne po prostu do zainicjowania „u” w tym przypadku. Dlatego g (u) nie jest zamknięciem, ponieważ „g” nie musi deklarować „t”.

Wniosek

W tym przewodniku rozmawialiśmy o zamknięciu Pythona. Wykonaliśmy również różne kody związane z tym tematem. Wymagamy funkcji w zamknięciu, aby zdefiniować następujące:

    • Funkcja zewnętrzna musi ją odzyskać.
    • Niektóre z zmiennych nielokalnych funkcji zewnętrznej powinny być przez nią uchwycone. Zmienne te można uzyskać bezpośrednio, zadeklarowane jako zmienne nielokalne, albo muszą zostać uchwycone przez zagnieżdżone zamknięcie.

Innymi słowy, funkcja i rozszerzony zakres z swobodnymi zmiennymi są uważane za zamknięcia. Wywołanie funkcji zewnętrznej w celu zwrócenia zamknięcia jest konieczne po ogłoszeniu zamknięcia w celu jej zainicjowania.