İçeriğe geç

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ı:

0
1
2
3
4

Bu ö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öner
print(next(gen)) # Devam ediyor ve 2 döner

Çıktı:

Başlıyor
1
Devam ediyor
2
Bitiyor

Burada 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ı:

1
2
StopIteration: Bitti

return 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)) # 0
print(next(gen)) # 1
print(next(gen)) # 2

Bu ö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ı:

1
2
3

Bu ö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.