Bu yazımda Python’da üreteçleri ve yield komutunu birkaç küçük örnek üzerinden anlatmaya çalışacağım. Öncelikle yineleme (iteration) kavramından bahsetmek istiyorum. Örneğin bir list yarattığımızda, elemanlarına teker teker ulaşmak yerine, bu işlemi bir döngü vasıtasıyla yaparsak yineleme yapmış oluruz. Kısa bir örnek;
1 2 3 4 |
listem=["uc","birim","com"] for i in listem: print i |
Burada listem isimli bir list yarattık ve elemanlarını bir döngü vasıtasıyla ekrana yazdık. Kodun çıktısı şu şekilde olacaktır;
1 2 3 |
uc birim com |
Yinelemeli araçlar gayet kullanışlıdır. Bu basit örnek sayesinde üreteçleri daha iyi anlayabileceğiz.
Artık üreteçlere (generators) geçebiliriz. Üreteçler birer yineleyicidirler (iterator). Farkları ise değerleri hafızada kayıtlı tutmak yerine işlemin gerçekleştiği anda üretmeleri. Bir örnekle pekiştirelim;
1 2 3 4 5 6 7 8 9 10 11 |
listem=["ucbirim.com" for i in range(3)] print listem for i in listem: print i uretecim=("ucbirim.com" for i in range(3)) print uretecim for i in uretecim: print i |
Bu örnekte ilk olarak içinde 3 tane “ucbirim.com” elemanı olan bir liste yarattık ve onu önce liste şeklinde sonra da yinelemeli bir şekilde ekrana yazdırdık. Peşinden aynı kod parçasını “[ ]” işaretleri yerine “( )” işaretlerini kullanarak tekrar yazdık ve bir üreteç oluşturmuş olduk. Bu kodun çıktısı aşağıdaki gibidir;
1 2 3 4 5 6 7 8 |
['ucbirim.com', 'ucbirim.com', 'ucbirim.com'] ucbirim.com ucbirim.com ucbirim.com <generator object <genexpr> at 0x7fe207392aa0> ucbirim.com ucbirim.com ucbirim.com |
Dikkat edilirse, üreteç direkt olarak print komutuyla ekrana yazılmak istendiğinde, list’de olduğu gibi bir sonuç alamadık çünkü daha önce söylediğim gibi üreteçler değerleri hafızada tutmuyor. Devamında dikkat edilirse istediğimiz değerleri yinelemeli olarak üretebildik.
Son olarak yield komutundan bahsetmek istiyorum. Yield komutu return komutuna benzer fakat farklı olarak bir değer yerine üreteç döndürür. Bir örnek kurgulayalım. Bir üreteç döndüren bir fonksiyon ile e sayısının 0’dan 9’a üstlerini ekrana basalım;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import math kac_kare=10 def fonksiyon(): listem=range(kac_kare) for i in listem: yield math.pow((math.e),i) uretec=fonksiyon() for i in uretec: print i |
Yukarıdaki örnekte bir sayının üstünü alabilmek ve e sayısının değerini kullanabilmek için önce math kütüphanesini import ettim. Fonksiyonun içinde 0’dan 9’a kadar olan sayılarla oluşmuş bir liste oluşturdum. Peşinden listem’deki elemanlarla e sayısının üstünü üreteç olarak döndürdüm. Unutmayalım, eğer for döngüsünden önce print uretec yazsaydım yine hata alacaktım. Programın çıktısı aşağıdaki gibidir.
1 2 3 4 5 6 7 8 9 10 |
1.0 2.71828182846 7.38905609893 20.0855369232 54.5981500331 148.413159103 403.428793493 1096.63315843 2980.95798704 8103.08392758 |
Python’un belli bir alanda en önemli gücüdür, konunun ciddiyetini anlayana tabi 🙂