Rozdział 13 · Automatyzacja z funkcjami
Zagnieżdżone funkcje i nonlocal
Funkcję można zdefiniować bezpośrednio wewnątrz innej funkcji — i nonlocal pozwala jej zmieniać nazwę funkcji obejmującej, a nie tylko ją odczytywać.
Funkcja w obrębie funkcji
Funkcję można zdefiniować bezpośrednio wewnątrz ciała innej funkcji:
vlozhennaya_funkciya.py
def outer():
message = "Hello"
def inner():
print(message)
inner()
outer()
inner widzi message jest Enclosing LEGB
inner() nie ma własnego message, ale znajduje go w funkcji obejmującej outer() — to litera „E” (Enclosing) z drabinki LEGB (§13.12).Wgłębienie nie jest ozdobą, lecz deklaracją gniazdowania
Gdy przypadkowo przesuniesz
def inner(): poziom wcięcia jest mniejszy niż konieczne, nie będzie już zagnieżdżony w outer — i odwrotnie. Wcięcie dosłownie określa, która funkcja jest „wewnątrz”nonlocal
Podobnie jak w przypadku zmiennych globalnych, można swobodnie odczytać nazwę z funkcji obejmującej, oraz oto ZMIANA (przypisuj) – musisz wyraźnie zapytać:
nonlocal.py
def outer():
count = 0
def inner():
nonlocal count
count += 1
inner()
inner()
print(count)
outer()
2
nonlocal — to NIE global
nonlocal szuka nazwy w NAJBLIŻSZEJ odpowiedniej funkcji obejmującej — nie na poziomie modułu. Jeśli usunąć nonlocal countotrzymasz ten sam błąd UnboundLocalErrorjak w §13.12 — z tego samego powodu: przypisanie w ramach inner by się dobrze count lokalnej nazwy inner.Trochę głębiej — zamknięcie (closure)
Funkcja zagnieżdżona potrafi „zapamiętać” wartości z funkcji otaczającej nawet po tym, jak wywołanie zewnętrzne już się zakończyło:
closure.py
def make_greeter(name):
def greet():
print(f"Cześć, {name}!")
return greet
greet_anna = make_greeter("Anna")
greet_anna() #Hey Anna! — chociaż make_greeter już skończył pracę
Zamknięcie to temat na przyszłość
Tak się nazywa zamknięcie —
greet dostęp „zabiera ze sobą” name. Wystarczy tu zauważyć, że w ogóle tak się dzieje — szczegółowa analiza zamknięć i ich praktycznych zastosowań (dekoratorów i nie tylko) nie została uwzględniona w tym rozdziale.Praktyka: funkcje zagnieżdżone i nonlocal
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji