- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
Merhaba! Şimdiye kadar öğrendiğimiz gibi, Listeler veya Tuple'lar gibi standart koleksiyonlar, oluşturuldukları anda tüm veriyi bellekte tutar. Bu, yüzlerce veya binlerce öğe için sorun değilken, milyonlarca veya milyarlarca öğe içeren veri kümelerinde (büyük dosyalar, sonsuz veri akışları) ciddi bellek sorunlarına yol açabilir.
Generators (Üreteçler), bu sorunu çözmek için tasarlanmıştır.
Generator: Bir defada tüm veriyi belleğe yüklemek yerine, yalnızca istendiğinde ve birer birer değer üreten, özel bir tür yinelenebilir (iterable) nesnedir.Generators, geleneksel fonksiyonlar gibi tanımlanır, ancak return yerine yield anahtar kelimesini kullanır.
yield Anahtar Kelimesinin GücüGenerator fonksiyonlarını sıradan fonksiyonlardan ayıran tek şey yield anahtar kelimesidir.
Bir generator fonksiyonu çağrıldığında, içindeki kod hemen çalışmaz. Bunun yerine bir generator nesnesi döndürülür.
for döngüsü gibi bir iterasyon başladığında, kod yield satırına kadar çalışır.
yield o anki değeri döndürür ve fonksiyonun durumunu (state) askıya alır. Tüm yerel değişkenler ve kodun konumu kaydedilir.
Bir sonraki değer istendiğinde (döngü bir sonraki adıma geçtiğinde), fonksiyon kaldığı yerden devam eder ve bir sonraki yield'e ulaşana kadar çalışır.
Fonksiyon bittiğinde veya return ile karşılaşınca iterasyon sonlanır.
Örnek: Basit Bir Generator
print("İlk değer üretiliyor...")
yield 1
print("İkinci değer üretiliyor...")
yield 2
print("Üçüncü değer üretiliyor...")
yield 3
# 1. Generator nesnesi oluşturulur (Kod henüz çalışmaz)
uretec = sayi_uretec()
# 2. for döngüsü başladığında kod çalışmaya başlar
(Tembel İterasyon)
for sayi in uretec:
print(f"Çekilen Sayı: {sayi}")
# Çıktı, adım adım ve sadece istendiğinde oluşur:
# İlk değer üretiliyor...
# Çekilen Sayı: 1
# İkinci değer üretiliyor...
# Çekilen Sayı: 2
# Üçüncü değer üretiliyor...
# Çekilen Sayı: 3
List Comprehension'a (Liste Oluşturma İfadesi) benzer şekilde, tek satırda küçük generator'lar oluşturabiliriz. Bu, köşeli parantez ([]) yerine parantez (()) kullanılarak yapılır.
Karşılaştırma:
| Liste Oluşturma (List Comprehension) | Generator İfadesi (Generator Expression) |
[x * 2 for x in range(1000000)] | (x * 2 for x in range(1000000)) |
| Hemen Hesaplar ve tüm sonucu belleğe yükler. | Tembeldir, değeri sadece istendiğinde üretir. Bellek dostudur. |
kare_ureteci = (x**2 for x in range(1, 11))
# İstenildiğinde değer çekme
print(next(kare_ureteci)) # Çıktı: 1 (İlk değeri üretir)
print(next(kare_ureteci)) # Çıktı: 4 (İkinci değeri üretir)
# Kalanını bir for döngüsüyle de çekebiliriz
for kare in kare_ureteci:
print(kare)
Generators, özellikle aşağıdaki senaryolarda hayat kurtarıcıdır:
| Senaryo | Fayda |
| Büyük Dosyalar | Bir dosyayı satır satır okurken (örneğin log dosyaları), dosyanın tamamını belleğe yüklememek için kullanılır. |
| Sonsuz Veri | Fibonacci serisi gibi matematiksel olarak sonsuz olabilecek veri akışlarını yönetmek için kullanılır (bellekte taşma yapmaz). |
| Performans | Verinin sadece küçük bir kısmına ihtiyaç duyuluyorsa, tüm veri setini üretme ve yükleme süresinden tasarruf sağlar. |
Python Generators, özellikle profesyonel ve büyük ölçekli uygulamalarda kaynakları verimli kullanmanın anahtarıdır. yield anahtar kelimesi, bir fonksiyonu yalnızca bir hesaplayıcıdan, bir veri akışı yöneticiye dönüştürür. Bellek sınırlamalarıyla uğraşmadan sonsuz veri veya devasa dosyalar üzerinde çalışmak istiyorsanız, Generator'lar en iyi dostunuzdur.
Hemen kursumuza kaydolun ve bu güçlü araçları kullanarak profesyonel Python geliştiricisi olma yolunda ilk adımı atın. Kursumuzdaki uygulamalı modüller, sizi sadece bir yazılımcı adayı değil, hazır bir profesyonel haline getirecek. Python Eğitimini Udemy platformunda bulabilirsiniz.
Yorumlar
Yorum Gönder