Iteratörler ve generatorler, Python'da dizileri verimli bir şekilde işlemenin temelidir. Tarihsel olarak Python, veri akışları ile çalışmayı kolaylaştırmayı ve büyük koleksiyonları bellekte aşırı şekilde saklamaktan kaçınmayı hedeflemiştir. Önce iter ve next protokolleri aracılığıyla iteratör desteği geldi, ardından yield bazlı yapılarla basit iteratörler yaratmayı sağlayan generatorler geldi.
Sorun: genellikle büyük veri setlerini işlemek gerekmektedir (örneğin, bir dosyadan veya veritabanından akış), bu da her şeyi birden belleğe yüklemeden uygun ve verimli bir şekilde gerçekleştirilemez. Normal fonksiyonlar tüm sonuçları bir anda döndürürken, kendi iteratörlerinizi oluşturmak için sınıflar kullanmak basit durumlar için genellikle çok karmaşık olur.
Çözüm: yield mekanizması, "tembel" veri oluşturma düzeni sağlamaktadır. Generator fonksiyonu bir liste veya başka bir koleksiyon döndürmez, bunun yerine ihtiyaç duyuldukça değerleri hesaplayan bir iteratör olan generator nesnesi döndürür.
Kod örneği:
# Basit bir generator def countdown(n): while n > 0: yield n n -= 1 for i in countdown(3): print(i) # 3, 2, 1
Ana özellikler:
return ve yield aynı fonksiyonda kullanılabilir mi?
Evet, ancak generator'daki return iterasyonu sonlandırır (StopIteration fırlatır), yield ise istenildiği kadar kullanılabilir.
def example(): yield 1 return # StopIteration
Tamamlandığında generator neden "yeniden başlatılamaz"?
Bir generator, iterasyonlar sona erdikten sonra (StopIteration) yeniden başlatılamaz, yeniden oluşturulması gerekir.
gen = countdown(2) list(gen) # [2, 1] list(gen) # [] (generator zaten tükenmiş)
Generator ile iteratör arasındaki fark nedir?
Generator, iteratorun özel bir durumudur; iter ve next yöntemlerine sahip her nesne iteratördür, ancak bir generator yield ile bir fonksiyon aracılığıyla oluşturulur.
Bir geliştirici, analize yönelik olarak dosyadan bir milyon satırı bellek içine yüklemek için list(fd) fonksiyonunu yazdı. Bu sunucuda bellek taşmasına yol açtı.
Artıları:
Eksileri:
Bir dosyayı satır satır okuyarak (bir seferde bir satır) ve verileri anlık olarak yield aracılığıyla analiz etmek için bir generator kullanmak.
Artıları:
Eksileri: