Bir uygulamanın kodlanma süreci, ziyadesiyle sorunlu bir süreçtir. Yazılımcılar, binlerce satır kodlama yaparken bu kodların düzgün olarak çalışabilmesi için ağır bir uğraş sarf ederler. Aksi takdirde yazılan kodlar çalışmayacaktır ve bu da yazılımcılar için önemli bir sorun teşkil ediyor.
Geliştiriciler, bir uygulamayı hazır hale getirebilmek için, uygulamanın kullanılacağı platform kapsamında çeşitli yazılım lisanları kullanabiliyorlar. “C”, “Java”, “Swift” ve “Python” üzere programlama lisanlarını bu bağlamda örnek olarak gösterebiliriz. Bu haberimizin konusu ise Python programa lisanında kullanılan, İngilizce olarak “Generators”, Türkçe karşılığı ise “Üreteç” olarak geçen komutlardan bahsedeceğiz. “Üreteçler nedir?” ve “Neden Kullanılmalı?” sorularının cevaplarını, bu haberimizde görebileceğiz.
Üreteçler, Python yazılım lisanında kullanılan tesirli sistemlerden bir adedidir. Profesyonel geliştiriciler, bu komutları kullanarak hem daha yeterli bir kod sistemine sahip oluyorlar hem de bu komutlar sayesinde uygulamalar daha rahat bir biçimde çalışabiliyor.
Yazılım geliştiriciler, bir kodlama sırasında sıralı datalardan sık sık faydalanıyorlar. Bu sayede datalar rahat bir formda kullanılıyor, kimi vakit da veritabanlarında depolanıyor. Lakin bu durumun bir dezavantajı bulunuyor. Sıralı datalarda bulunan öğelerin sayısı ön görülemez. Kimi vakit makul sayılarda öğeler bulunurken kimi vakitse çok sayıda öğe olabilir ve bu da uygulamanın çalışma performansını tesirler. Artık, sıralı datalardan ve listelerden oluşan bir kod örneğini inceleyelim.
def scale_to_log10(till_number):
log10_number_seq = []
for num in range(1, till_number):
log10_number_seq.append(math.log10(num))
return log10_number_seq
Bu kod, bakıldığı vakit ziyadesiyle kısa üzere görünebilir. Lakin kodların ortasında bulunan “range” komutu, yazılımcıya daima bir döngü oluşturacaktır. Bu döngü, sonsuz bir bellek alanında sıkıntısız çalışabilir fakat bu döngünün boyutu artmaya başladığı vakit işler büsbütün karışacaktır. Örnek vermek gerekirse bu döngü 4 GB'lik bir boyuta sahip olabilir. Fakat ayrılan bellek 2 GB olursa sistem çökecek ve süreç yarıda kalacaktır. İşte tam da bu noktada generators komutlarından faydalanılıyor. Geliştiriciler, generators komutlarını kullanarak yalnızca muhtaçlık olduğu vakit bu döngünün içerisine giriyorlar ve bu da RAM ve işlemci kullanımını direkt etkiliyor. Bu sistem sayesinde uygulamalar, daha rahat bir formda çalışıyorlar ve rastgele bir çökme durumu yaşanmıyor.
Şimdi de geliştiricilerin, bu komutları nasıl kullandıklarına bakalım;
def scale_to_log10(till_number):
for num in xrange(till_number):
yield math.log10(num)
Bu kod, temelde yukarıda bulunan kodlarla tıpkı fonksiyonu görüyor. Yalnızca bu kodun öğeleri sürece biçimi biraz daha farklı. İkinci koddaki ufak farklar, kod kesitinin yalnızca o an işlenen öğeyi belleğe aktarılmasını sağlıyor. Bu da hem gereksiz boyutları ortadan kaldırıyor hem de işlemci ve RAM kullanımının optimizasyonunu sağlıyor.