Python'da yield Özelliğinin Kullanımı
Python yield Özelliği
Python’da yield anahtar kelimesi, fonksiyonların değer üretip duraklatılmasını sağlayan ve bu sayede bir iterator yaratan bir yapıdır. yield anahtar kelimesi, fonksiyonları birer jeneratöre dönüştürerek her çağrıldığında bir değer döndüren ve durduğu yerden devam edebilen fonksiyonlar oluşturur.
yield ile Fonksiyonlar
Normal bir fonksiyonda return ifadesi kullanıldığında, fonksiyon bir değer döndürür ve biter. Ancak yield kullanıldığında, fonksiyon bir değer döndürür ve kaldığı yerden çalışmaya devam eder. Jeneratörler, belleği daha verimli kullanmak için tercih edilir çünkü tüm sonuçları aynı anda bellekte tutmak yerine ihtiyaca göre üretirler.
Örnek:
def sayilar(): for i in range(5): yield i
gen = sayilar()for num in gen: print(num)Çıktı:
01234Bu örnekte, yield her bir adımda bir sayı üretir ve duraklatır.
yield ve Jeneratörlerin Avantajları
Jeneratörler, büyük veri setleriyle çalışırken veya hesaplamaları adım adım yapmak istendiğinde avantaj sağlar. Büyük bir listeyi veya veriyi bellekte tutmak yerine, yield kullanarak sadece gerekli olan veriler üretilebilir.
Bellek Verimliliği:
def buyuk_liste(): for i in range(10**6): yield i
gen = buyuk_liste()Bu sayede milyonlarca öğe aynı anda bellekte tutulmaz, sadece gerekli olan öğe üretilir.
Jeneratörlerin Durumu Korumak
Jeneratörler, kaldıkları yeri hatırlama yeteneğine sahiptir. Yani yield kullanılarak duraklatılan fonksiyon, bir sonraki çağrıda kaldığı yerden devam eder.
Örnek:
def say(): print("Başlıyor") yield 1 print("Devam ediyor") yield 2 print("Bitiyor")
gen = say()print(next(gen)) # Başlıyor ve 1 dönerprint(next(gen)) # Devam ediyor ve 2 dönerÇıktı:
Başlıyor1Devam ediyor2BitiyorBurada fonksiyon her yield ifadesinde duraklar ve sonraki next() çağrısı ile kaldığı yerden devam eder.
yield ve return Farkı
return, bir fonksiyonun çalışmasını sonlandırırken yield, fonksiyonu duraklatır ve daha sonra kaldığı yerden devam etmesini sağlar. Aynı fonksiyon içinde hem yield hem return kullanılabilir, ancak return, jeneratörün sonunu belirtir.
Örnek:
def karisik(): yield 1 yield 2 return "Bitti" yield 3 # Bu kısım çalışmaz
gen = karisik()print(next(gen))print(next(gen))print(next(gen)) # StopIteration hatasıÇıktı:
12StopIteration: Bittireturn ifadesi çalıştığında jeneratör sona erer ve sonraki yield çalışmaz.
Sonsuz Jeneratörler
yield, sonsuz döngülerde de kullanılabilir. Bu şekilde bir jeneratör, talep üzerine sınırsız sayıda değer üretebilir.
Örnek:
def sonsuz_sayilar(): i = 0 while True: yield i i += 1
gen = sonsuz_sayilar()print(next(gen)) # 0print(next(gen)) # 1print(next(gen)) # 2Bu örnekte, while True döngüsü ile jeneratör sonsuz bir şekilde sayı üretmeye devam eder.
yield from
Python 3.3 ile birlikte gelen yield from ifadesi, başka bir jeneratörden değerleri doğrudan delege etmek için kullanılır. Bu, özellikle jeneratörler arasında değerleri zincirlemek için kullanışlıdır.
Örnek:
def alt_jeneratör(): yield 1 yield 2
def ana_jeneratör(): yield from alt_jeneratör() yield 3
for deger in ana_jeneratör(): print(deger)Çıktı:
123Bu örnekte, yield from, alt_jeneratör fonksiyonundaki değerleri doğrudan ana jeneratöre delege eder.
Sonuç
yield anahtar kelimesi, Python’da jeneratörler oluşturmanın en temel yoludur. Jeneratörler, belleği verimli kullanarak büyük veri setleriyle çalışmak veya sonsuz veri akışlarını işlemek için oldukça faydalıdır. Ayrıca yield ile fonksiyonların duraklatılıp kaldığı yerden devam etmesi sağlanabilir, bu da onları güçlü bir araç haline getirir.