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