3.1 Qapanışlarla tanışlıq
Qapanış — bu elə bir funksiyadır ki, öz ətrafında olan məsafə (scope) daxilindəki dəyişənləri tutub saxlayır, məsələn, bu məsafə artıq öz işini tamamladıqdan sonra belə. Bu o deməkdir ki, qapanış dəyişənlərin xarici məsafədə olan dəyərlərini “xatırlaya” bilir və onlarla işləməyə davam edir, hətta həmin məsafə daha aktiv olmasa belə.
Qapanışların necə işlədiyini başa düşmək üçün aşağıdakı misala baxaq:
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(10)
print(closure(5)) # Çıxış: 15
Burada nə yazıldığına nəzər salaq:
Xarici funksiya (outer_function)
: Bu funksiya x
arqumentini qəbul edir və daxili funksiya olan inner_function
təyin edir. Bu funksiya y
arqumentini qəbul edir və x
ilə y
-nin toplamını qaytarır. inner_function
funksiyası isə outer_function
daxilində çağırılmır, sadəcə elan olunur.
Daxili funksiya (inner_function)
: Bu funksiya outer_function
tərəfindən qaytarılır və öz daxilində x
dəyərinə keçid linkini saxlayır, hansı ki, outer_function
-ə ötürülmüşdü.
Qapanış: closure
dəyişəni qapanışa çevrilir, hansı ki, x
dəyərini (bu halda, 10) “xatırlayır” və həmin dəyərdən çağırış zamanı istifadə edə bilir.
Adətən, heç kim qapanışlarla birinci dəfə işlədikdə hər şeyi ideal şəkildə anlamır. Buna görə gəlin qapanışlar mövzusunda anlayışımızı nümunələr üzərində inkişaf etdirək.
3.2 Bağlamaların İstifadəsinə Nümunələr
Generator-funksiya yaradılması
Bağlamalar dəyərlər ardıcıllığını yaradan generator-funksiyalar yaratmaq üçün istifadə edilə bilər.
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
counter = make_counter()
print(counter()) # Nəticə: 1
print(counter()) # Nəticə: 2
print(counter()) # Nəticə: 3
İzah:
Generator-funksiya (make_counter)
: Bu funksiya count
dəyişənini yaradır və onun dəyərini artıran və döndərən counter
daxili funksiyasını qaytarır.
Bağlama: counter
funksiyası count
dəyişənini saxlayır və hər çağırışda onu dəyişdirə bilər.
Konfiqurasiya ilə funksiya yaradılması
Bağlamalar əvvəlcədən müəyyən edilmiş konfiqurasiya ilə funksiyalar yaratmaq üçün istifadə edilə bilər.
def make_multiplier(factor):
def multiplier(x):
return x * factor
return multiplier
double = make_multiplier(2)
triple = make_multiplier(3)
print(double(5)) # Nəticə: 10
print(triple(5)) # Nəticə: 15
İzah:
Konfiqurator-funksiya (make_multiplier)
: Bu funksiya çarpan factor
qəbul edir və daxil olan dəyəri factor
-a vurmaq üçün istifadə edilən multiplier
daxili funksiyasını qaytarır.
Bağlamalar: double
və triple
funksiyaları öz factor
dəyərlərini saxlayan və onları vurma üçün istifadə edən bağlamalardır.
Parametrlərlə verilənlərin filtrasiyası
Bağlamalar parametrləri olan filtr funksiyaları yaratmaq üçün faydalı ola bilər.
def make_filter(threshold):
def filter_func(value):
return value > threshold
return filter_func
filter_above_10 = make_filter(10)
data = [5, 10, 15, 20]
filtered_data = list(filter(filter_above_10, data))
print(filtered_data) # Nəticə: [15, 20]
İzah:
Filtr-funksiya (make_filter)
: Bu funksiya threshold
həddi qəbul edir və dəyərin həddi keçib-keçmədiyini yoxlamaq üçün istifadə edilən filter_func
daxili funksiyasını qaytarır.
Bağlama: filter_func
funksiyası threshold
dəyərini saxlayır və onu verilənlərin filtrasiyası üçün istifadə edir.
3.3 Bağlamaların üstünlükləri və çatışmazlıqları
Bağlamalardan istifadə etmənin üstünlükləri
Vəziyyətin inkapsulyasiyası: Bağlamalar funksiyanın daxilində vəziyyəti inkapsulyasiya etməyə imkan verir; bu da qlobal dəyişənlərdən qaçınmağa və kodun oxunaqlılığını və dəstəyini artırmağa kömək edir.
Esneklik: Bağlamalar müəyyən konfiqurasiya və ya davranışa malik funksiyalar yaratmaq üçün istifadə oluna bilər ki, bu da kodun daha çevik və uyarlanabilir olmasını təmin edir.
Funksional proqramlama: Bağlamalar funksional proqramlaşdırmada mühüm bir konsepsiyadır, ali səviyyəli funksiyalar və digər funksional quruluşlar yaratmağa imkan verir.
Məhdudiyyətlər və potensial problemlər
Bir çox üstünlüyə baxmayaraq, bağlamaların bəzi məhdudiyyətləri də var:
Yaddaş istifadə etməsi: Bağlamalar artıq istifadə olunmayan obyektlərə istinadları saxlaya bilər, bu da yaddaş sızmalarına səbəb ola bilər.
Debug edərkən çətinlik: Bağlamalar kodun debug edilməsini çətinləşdirə bilər, çünki dəyişənlərin vəziyyəti aydın olmaya bilər.
GO TO FULL VERSION