Bu makalemizde Python’da İteratörler ve Generatörler konusunu anlatıyor olacağım.
İteratörler
Python’da iteratorler, veri koleksiyonlarında dolaşmak ve elemanları tek tek işlemek için kullanılan bir kavramdır. Bir iterator, bir nesne üzerinde sıralı bir şekilde ilerleyebilme yeteneğine sahip olan ve next()
fonksiyonunu kullanarak bir sonraki elemana erişmemizi sağlayan bir objedir.
Python’da iteratorlerle çalışmak için iter()
ve next()
fonksiyonlarını kullanırız. iter()
fonksiyonu, bir veri koleksiyonunu veya bir nesneyi iterator olarak dönüştürmemizi sağlar. next()
fonksiyonu ise bir iterator üzerinde ilerleyerek bir sonraki elemana erişir ve eğer son elemana ulaşılmışsa bir StopIteration
hatası fırlatır.
Bir iteratorün önemli avantajlarından biri, bellek verimliliğidir. İteratörler, veri koleksiyonunu tamamen belleğe yüklemek yerine elemanları tek tek işlerler. Bu, büyük veri koleksiyonlarıyla çalışırken bellek kullanımını minimize etmemize yardımcı olur.
İteratörlerin bir diğer önemi, for
döngülerinde kullanılmalarıdır. for
döngüsü, bir iterator üzerinde otomatik olarak next()
fonksiyonunu çağırarak elemanlara erişir ve döngüyü sonlandırır. Böylece, iteratorler sayesinde döngülerimizi daha verimli bir şekilde yönetebiliriz.
listem=[1,2,3,4,5] itereEtme=iter(listem) print(next(itereEtme)) #1 print(next(itereEtme)) #2 print(next(itereEtme)) #3 print(next(itereEtme)) #4 print(next(itereEtme)) #5
Kodumuzun ekran çıktısı aşağıdaki gibidir:
Yukarıdaki örnekte, listem adlı bir liste oluşturduk ve iter() fonksiyonunu kullanarak iterEtme adlı bir iterator oluşturduk. Ardından, next() fonksiyonunu kullanarak her çağrıda bir sonraki elemana eriştik.
Iteratorler, for döngüsüyle birlikte de kullanılabilir:
listem=[1,2,3,4,5] for iterEtme in listem: print(iterEtme)
Kodumuzun ekran çıktısı aşağıdaki gibidir:
Bu for döngüsü, listenin her elemanını tek tek dolaşır ve ekrana yazdırır. Arkada, döngü iter() fonksiyonunu kullanarak listenin üzerinde bir iterator oluşturur ve next() fonksiyonunu çağırarak her elemana erişir.
Özetlemek gerekirse, iteratorler Python’da veri koleksiyonlarıyla etkileşim kurmak için kullanılan güçlü bir araçtır. Iteratorler, bellek verimliliği sağlar ve for döngüleriyle birlikte kullanıldığında kodun daha okunaklı ve sade olmasını sağlar.
Generatörler
Generatörler Python’da veri koleksiyonlarını yaratmak için kullanılan işlevlerdir. Generatörler, bir değer üretirken bellekte tam bir koleksiyon oluşturmak yerine, değerleri adım adım hesaplar ve çağırıldığında bu değerleri verir. Böylece, bellek kullanımını minimize ederek verimli bir şekilde çalışmamızı sağlarlar.
Generatörler, fonksiyonlarla benzer bir sözdizimine sahiptir. Ancak, değerleri return ifadesi yerine yield ifadesiyle döndürürler. yield ifadesi, bir değeri üretir ve generatörün durumunu geçici olarak dondurur. Daha sonra generatör çağrıldığında, durum kaldığı yerden devam eder ve bir sonraki değeri üretir.
Şimdi bu konuyu fibonacci işlemiyle anlatalım:
def fibo(): x,y=0,1 while True: yield x x,y=y,x+y fibonacciSayi=fibo() print(next(fibonacciSayi)) #0 print(next(fibonacciSayi)) #1 print(next(fibonacciSayi)) #1 print(next(fibonacciSayi)) #2 print(next(fibonacciSayi)) #3 print(next(fibonacciSayi)) #5
Kodumuzun ekran çıktısı aşağıdaki gibidir:
Yukarıdaki örnekte, fibo()
adlı bir generatör işlevi tanımladık. Bu işlev, sonsuz bir Fibonacci dizisi üretir. Her yield
ifadesi, bir Fibonacci sayısını üretir ve generatörün durumunu geçici olarak dondurur. Ardından, next()
fonksiyonunu kullanarak generatörden bir sonraki değeri alırız.
Generatörleri for
döngüsüyle de kullanabiliriz:
def fibo(): x,y=0,1 while True: yield x x,y=y,x+y fiboSayilarim=fibo() for i in range(5): print(next(fiboSayilarim))
Kodumuzun ekran çıktısı aşağıdaki gibidir:
Bu örnekte, for
döngüsü generatörün her bir değerini alır ve ekrana yazdırır. Döngü, belirli bir sayıda tekrar eder ve generatörün sonsuz bir şekilde çalışmasını engeller.
Generatörlerin en önemli avantajlarından biri, bellek verimliliğidir. Generatörler, sadece bir sonraki değeri hesaplayıp döndürdüğü için bellekte sadece bir değeri tutarlar. Bu özellik, büyük veri koleksiyonlarıyla çalışırken hafızadan tasarruf etmemizi sağlar.
Generatörler, veri koleksiyonlarının dinamik olarak oluşturulmasını sağlar ve hesaplama sürecini daha etkin hale getirir. Özellikle büyük veri kümeleri veya sonsuz veri akışlarıyla çalışırken generatörler kullanmak oldukça faydalı olabilir.
0 Yorum