Python'da Jeneratörler Nasıl Kullanılır (verim bildirimi)

Python'da jeneratörlerin nasıl yazılacağını öğrenin. Getiri anahtar kelimesini, tembel değerlendirmeyi, bellek optimizasyonunu anlayın ve oluşturucuları liste yapılarıyla karşılaştırın.

Bu Çözümü Editör'de deneyin

Genel Bakış

Büyük veri kümeleri, günlük dosyaları veya sonsuz veri akışlarıyla çalışırken, tüm öğeleri aynı anda belleğe yüklemek (büyük bir listeyi döndürmek gibi), sistem RAM'ini kolayca tüketebilir ve uygulamanızı çökertebilir. Python harika, bellek açısından verimli bir çözüm sunuyor: Jeneratörler.

Jeneratör, tembel bir yineleyici döndüren özel bir fonksiyon türüdür. Tüm değerleri bir kerede hesaplayıp döndürmek yerine, bir oluşturucu istendiği gibi değerleri tek tek üretir. Temel fark "verim" ifadesidir. Bir üreteç işlevi "verim"i çağırdığında, yürütme durumunu (değişkenler, talimat işaretçisi) duraklatır ve elde edilen değeri döndürür. Bir sonraki değer istendiğinde fonksiyon tam olarak kaldığı yerden devam eder.

Jeneratör hesaplamaları tembel bir şekilde yürütüldüğünden, veri kümesi boyutundan bağımsız olarak neredeyse sıfır bellek kullanırlar. Python ayrıca, tam işlevleri bildirmeden hafif satır içi oluşturucular oluşturmak için parantez içindeki "(verideki x için x)" sözdizimini kullanan oluşturucu ifadelerini de destekler.

Kod ve Yürütme Çıkışı

Bu komut dosyası, verim ifadesi ve oluşturucu ifadeleriyle oluşturucu işlevlerini kullanarak dizi oluşturmayı gösterir.

generators_demo.py
Editör'de deneyin
# 1. Generator function using yield
def count_up_to(limit):
    count = 1
    while count <= limit:
        yield count
        count += 1

# Instantiating the generator
counter = count_up_to(3)
print("Memory safe generator instantiated.")

# Fetching values manually
print("Next 1:", next(counter))
print("Next 2:", next(counter))
print("Next 3:", next(counter))

# 2. Iterating with a for loop (automatically handles StopIteration)
print("\n--- Looping over generator ---")
for num in count_up_to(4):
    print("Num:", num)

# 3. Generator expression (Shorthand syntax)
squares_gen = (x**2 for x in range(1, 4))
print("\nGenerator expression elements:")
print(list(squares_gen)) # Cast to list to print all elements
Terminal Çıkışı
Memory safe generator instantiated.
Next 1: 1
Next 2: 2
Next 3: 3

--- Looping over generator ---
Num: 1
Num: 2
Num: 3
Num: 4

Generator expression elements:
[1, 4, 9]

Adım Adım Uygulama

  • Standart def anahtar sözcüğünü kullanarak bir işlev tanımlayın.
  • Verim değerlerini yineleyici akışına geri döndürmek yerine getiri anahtar sözcüğünü kullanın.
  • Değerleri çıkarmak için for döngüsü kullanarak jeneratör üzerinde yineleme yapın veya yerleşik next(gen) fonksiyonunu çağırın.
  • Basit, satır içi tembel dönüşümler için oluşturucu ifadeleri (parantez kullanarak) kullanın.

Sıkça Sorulan Sorular

Jeneratörlerin listelere göre temel avantajı nedir?

Bellek verimliliği. Listeler tüm öğeleri aynı anda RAM'de depolarken, oluşturucular öğeleri isteğe bağlı olarak tek tek üreterek sisteminizin toplam belleğinden daha büyük veri kümelerini işlemenize olanak tanır.

Bir jeneratörde öğe kalmadığında ne olur?

Python bir StopIteration istisnası oluşturur. Bir for döngüsü, döngüden sorunsuz bir şekilde çıkmak için bu istisnayı otomatik olarak yakalar, ancak tükenmiş bir oluşturucuda next() öğesinin manuel olarak çağrılması, istisnayı atacaktır.

İlgili Konular

Önerilen Python Kaynakları

İlgili etkileşimli eğitimler, yardımcı sayfalar ve kod karşılaştırmalarıyla bilginizi genişletin.