Jeneratörler, Python’da değer dizileri üretmek için bellek açısından verimli bir yol sağlayan güçlü bir özelliktir. Bununla birlikte, yinelemeden önce bir jeneratörün boş olup olmadığını belirlemek, diğer yinelebilir türlere göre daha az kolay olabilir. Bu makale, jeneratör boşluğunu kontrol etmenin verimli ve etkili yöntemlerini inceliyor.
Boş Jeneratörleri Verimli Bir Şekilde Kontrol Etme
En verimli yöntem, next()
fonksiyonunu ve istisna işlemeyi kullanır. next()
, jeneratörden sonraki öğeyi almaya çalışır. Jeneratör boşsa, boşluk olup olmadığını belirlemek için yakalayabileceğimiz bir StopIteration
istisnası oluşturur.
def my_generator(values):
for value in values:
yield value
gen = my_generator([1, 2, 3])
try:
next(gen)
is_empty = False
except StopIteration:
is_empty = True
print(f"Jeneratör boş mu? {is_empty}") # Çıktı: False
empty_gen = my_generator([])
try:
next(empty_gen)
is_empty = False
except StopIteration:
is_empty = True
print(f"Jeneratör boş mu? {is_empty}") # Çıktı: True
Bu yaklaşım, yalnızca tek bir öğeyi almaya çalıştığı için idealdir. Jeneratör boş değilse, bir öğe tüketir; aksi takdirde hiç tüketmez, bu da onu oldukça bellek verimli kılar.
Daha Az Verimli Yöntemler (Mümkünse Kaçının)
Alternatif bir yaklaşım, jeneratörü list()
kullanarak bir listeye dönüştürmeyi ve uzunluğunu kontrol etmeyi içerir. Bununla birlikte, bu yöntem, büyük jeneratörler için tüm jeneratörü belleğe yüklediği için önemli ölçüde daha az verimlidir. Bu yöntemi yalnızca bellek birincil bir endişe değilse ve jeneratörün içeriğine liste olarak da ihtiyacınız varsa kullanın.
def my_generator(values):
for value in values:
yield value
gen = my_generator([1,2,3])
list_gen = list(gen)
is_empty = len(list_gen) == 0
print(f"Jeneratör boş mu? {is_empty}") # Çıktı: True (jeneratörü tükettikten sonra)
empty_gen = my_generator([])
list_gen = list(empty_gen)
is_empty = len(list_gen) == 0
print(f"Jeneratör boş mu? {is_empty}") # Çıktı: True
Doğru Yaklaşımı Seçme
Çoğu senaryo için, verimliliği nedeniyle istisna işleme yöntemiyle next()
yöntemi şiddetle tavsiye edilir. Gereksiz bellek tüketimini önler ve jeneratörle yalnızca minimum düzeyde etkileşim kurar. Liste dönüştürme yöntemi yalnızca jeneratörün içeriğine liste olarak ihtiyacınız varsa ve bellek kullanımı sınırlayıcı bir faktör değilse düşünülmelidir.
Özellikle büyük jeneratörlerle çalışırken, her zaman en bellek verimli çözümü önceliklendirmeyi unutmayın.
İçindekiler