Generatorlar hər iterasiya (təkrarlanan əməliyyat) zamanı müəyyən bir qiyməti qaytaran funksiyalardır. Proqramlaşdırmada generatorlara təmbəl iteratorlar da deyilir. Belə ki, generatorlar yalnız onlardan tələb olunduğu zaman qiymət qaytarırlar. Adi funksiyalardan fərqli olaraq generatorlar qiyməti yield açar sözü ilə qaytarırlar. Generatorlarda funksiyadan çıxış nöqtəsi (daxili dəyişənlərin cari qiymətləri) yadda saxlanılır və növbəti müraciət zamanı funksiyanın işi qaldığı yerdən davam edir.
Gəlin tələb olunan sayda Fibonaçi ədədlərini əldə etmək üçün generator funksiyadan istifadə edək. Riyaziyyatdan da bildiyiniz kimi ilk iki Fibonaççi ədədləri 0 və 1-dir. Sonra gələn ədəd özündən əvvəlki ilk iki qonşusunun cəminə bərabərdir: 0, 1, 1, 2, 3, 5, 8, 13… Bəzi mənbələrdə sıranın ilk ədədi 0 yox, 1 götürülür.
def fibonacci(n): fib1, fib2 = 0, 1 print('Generasiya başladı...') for i in range(n): fib1, fib2 = fib2, fib1+fib2 yield fib1 print(end='\n') print('Generasiya sona çatdı.') for fib in fibonacci(10): print(fib, end=' ')
Proqramı incələyək. Əvvəlcə fibonacci() adlı generator təyin edilir. Daha sonra sayğaclı dövrdə dövr ardıcıllığı kimi bu generatordan arqument (10) göndərilərək istifadə edilir. Gördüyünüz kimi dövrdə hər dəfə fibonacci() generator funksiyasına müraciət olunur. Və hər müraciətin nəticəsində generator bir qiymət qaytarır. Generatora ilk müraciətdə əvvəlcə ekrana Generasiya başladı məlumatı çıxarılır. Diqqət yetirin ki, bu sətir yalnız bir dəfə çap olunur. Generatorun daxilində sayğaclı dövr qurularaq Fibonaçi ədədi tapılır və yield açar sözü ilə qiymət olaraq qaytarılır. Burada yield operatorunun istifadəsi generator funksiyanın işində pauza verir və daxili dəyişənlərin (i, fib1, fib2) cari qiymətləri yadda saxlanılır. Bununla da generatorun qaytardığı ilk qiyməti (1) proqramdakı sayğaclı dövrün idarəetmə dəyişəni olan fib qəbul edir və ekranda çapa verilir. Biz burada print() funksiyasında end=’ ‘ parametrindən istifadə edirik. Bunu ona görə edirik ki, növbəti Fibonaçi ədədi eyni sətirdə çıxsın. İlk Fibonaçi ədədi ekrana çıxdıqdan sonra dövrdə yenidən fibonacci() generatoruna müraciət olunur və generator öz işinə qaldığı yerdən davam edir. Proses bu minvalla o vaxta qədər davam edir ki, generator daxilindəki sayğaclı dövrün i parametri sonuncu qiymətini (9) almış olsun. Bundan sonra proqramdakı dövrdə yenidən generatora müraciət edildiyi zaman (generator daxilindəki sayğaclı dövr öz işini yekunlaşdırdığına görə) kursor növbəti sətrə keçirilir və ekrana Generasiya sona çatdı məlumatı çıxarılır.
Generasiya başladı... 1 1 2 3 5 8 13 21 34 55 Generasiya sona çatdı.