JET School

Generatorlar nədir?

Python-da generatorlar (Generators) — ardıcıl verilənləri tək-tək istehsal etmək üçün istifadə olunan xüsusi funksiyalardır. Onlar klassik funksiyalardan əsaslı şəkildə fərqlənir. Ən önəmli fərq odur ki, generatorlar return yerinə yield açar sözündən istifadə edirlər. Bu, o deməkdir ki, generator funksiyası çağırıldıqda bütün hesablama birdəfəlik tamamlanmır. Əvəzində, funksiyanın vəziyyəti saxlanılır və növbəti dəfə funksiyanı çağırdıqda (məsələn, next() funksiyası ilə), işləmə əvvəlki vəziyyətdən davam edir.

Generatorlar “lazy evaluation”, yəni "tənbəl qiymətləndirmə" prinsipinə əsaslanır. Bu prinsip, məlumatların yalnız ehtiyac olduğu anda yaradılmasını təmin edir. Bu, çox böyük verilənlər bazaları ilə işləyərkən və ya limitsiz (sonsuz) ardıcıllıqlar yaratmaq lazım olduqda sistemin yaddaş və prosessor resurslarını qorumağa imkan verir.

Sadə nümunə:

def say_hello():

yield "Salam"

yield "Necəsən?"

yield "Sağ ol"

Bu funksiyanı çağırdıqda dərhal bütün cavablar qaytarılmır. Əvəzində:

g = say_hello()

print(next(g)) # Çıxış: Salam

print(next(g)) # Çıxış: Necəsən?

print(next(g)) # Çıxış: Sağ ol

Əgər artıq yield qalmayıbsa, StopIteration xətası yaranır.

Geniş istifadə sahələri:

  • Faylların sətr-sətr oxunması: Məsələn, çox böyük .csv faylı varsa, open() ilə faylı oxumaq əvəzinə generatorla sətr-sətr analiz etmək mümkündür.
  • Web scraping: Veb saytlardan məlumatlar yığarkən səhifə-səhifə və ya element-element işləmək üçün.
  • Məlumat axını (stream processing): Reallıqda axınla gələn məlumatları ancaq ehtiyac olduqda istifadə edərək emal etmək.
  • Limitsiz ardıcıllıqların yaradılması: Məsələn, fibonacci() generatoru ilə sonsuz Fibonacci ədədləri yaradıla bilər.

Mürəkkəb misal – Fibonacci generatoru:

def fibonacci():

a, b = 0, 1

while True:

yield a

a, b = b, a + b

f = fibonacci()

for _ in range(10):

print(next(f)) # İlk 10 Fibonacci ədədi

Generatorlarla iteratorlar arasındakı fərq:

Hər bir generator bir iterator-dur, lakin hər iterator generator deyil. Generatorlar daha sadə şəkildə iterator funksionallığını həyata keçirə bilər, çünki __iter__() və __next__() metodlarını avtomatik olaraq idarə edirlər.

Üstünlükləri:

  • Yaddaşa qənaət – məlumatlar tək-tək yaradıldığı üçün sistem resurslarına qənaət edilir.
  • Yüksək performans – böyük məlumatlar üzərində sürətli və effektiv işləmək olur.
  • Kodun modulyarlığı və oxunaqlılığı artır – mürəkkəb for dövrləri əvəzinə daha təmiz və strukturlu kod yazılır.

Əlaqəli terminlər:

IT sahəsini dərindən öyrənmək üçün kurslarımıza qoşulun. Ətraflı məlumat almaq üçün sorğu göndərin!