Python’da Generator Fonksiyonlar

Generator fonksiyonlar; duraklayarak bir veri dönen ve bir daha çağrıldığında kaldığı yerden devam eden fonksiyonlardır. Büyük veri setlerinde bütün veriyi bellekte(memory) tutmadan çağrıldıkça döndürerek avantaj sağlayabilir.

Söz dizimi olarak normal bir fonksiyondan farkı yoktur, fazlalık olarak veri döndürmek için return yerine yield anahtar kelimesini kullanırız.

def gerisay(bas):
  while bas>0:
    print(bas)
    yield bas
    bas -= 1

bestenSay = gerisay(5)

print(type(bestenSay))

Bu basit örnekte kodumuz yield satırına geldiğinde duracak ve num değişkenini döndürür. gerisay() tekrar çağırıldığında num -= 1 kodunu çalıştırarak devam eder. Peki bu fonksiyonu nasıl çağıracağız. Son satırda tipini yazdırdığımız bestenSay değişkeni bir generator nesnesidir. Generator nesnelerinin kaldığı sıradan devam etmesi yada çalışmaya başlaması için next() fonksiyonu içine parametre olarak vermemiz gerekir.

next(bestenSay) # 5
next(bestenSay) # 4
next(bestenSay) # 3
next(bestenSay) # 2
next(bestenSay) # 1
next(bestenSay) # StopIteration Exception

Next ile ilk çağırışımızda fonksiyon en baştan başlayarak ilerler ta ki yield görene kadar. Burada fonksiyon içindeki durum tutularak yield önündeki değer döndürülür, daha sonraki next çağırımında bu durum ile kod çalışmaya devam eder. Artık bir yield kalmadığında yani fonksiyonun sonuna geldiğimizde StopIteration Exception’ı dönecektir.

Bir başka çağırma yöntemi de for .. in anahtar kelimeleri iledir. Burada generator fonksiyonumuz bitene kadar döngü işleyecektir.

for sayi in bestenSay:
  continue # yer doldurması için
'''
Konsola
5
4
3
2
1
basacaktır.
'''

List veri tiplerinde olduğu gibi Generator’lar içinde satır için bir tanımlama yapılabilir.

import sys

geriSayGene = (x for x in range(100000))
geriSayList = [x for x in range(100000)]

print(sys.getsizeof(geriSayGene))
# 88
print(sys.getsizeof(geriSayList))
# 824464

List’e karşı bellek üzerinde olan bu avantaj hız dezavantajı olarak geri döner. List kullanımı bellek hassasiyeti yok ise daha hızlıdır.

Bir Cevap Yazın